Невозможно переместить (переименовать) узел с помощью Jackrabbit и WebDAV
Я пытаюсь переименовать узел в Jackrabbit, но он терпит неудачу, как показано ниже. Учитывая узел "/fooNode", я хочу, чтобы он был переименован в "/fooNodeRenamed".
Мой клиент - простая Java-программа, основанная на JavaDavexClient с использованием Apache Jackrabbit 2.6.2 и Oracle Java 1.7.0_25 на Debian Wheezy.
Вот код:
import javax.jcr.Credentials;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.SimpleCredentials;
import javax.jcr.version.*;
import ch.liip.jcr.davex.DavexClient;
public class Client
{
public static void main(String[] args)
{
try {
// Config
String url = "http://localhost:8080/jackrabbit/server/";
String sourceWorkspaceName = "test-preview";
// Setup
DavexClient Client = new DavexClient(url);
Repository repo = Client.getRepository();
Credentials sc = new SimpleCredentials("admin", "admin".toCharArray());
Session sourceSession = repo.login(sc, sourceWorkspaceName);
// Create a node
Node fooNode = sourceSession.getRootNode().addNode("fooNode");
sourceSession.save();
// Rename the node - GIVES EXCEPTION
sourceSession.move("/fooNode", "/fooNodeMoved");
// This line is never reached
sourceSession.save();
} catch (RepositoryException e) {
e.printStackTrace();
}
}
}
Я очищаю рабочее пространство каждый раз перед запуском вышеуказанного. Вот исключение:
javax.jcr.RepositoryException: Internal Server Error
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:120)
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:51)
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:45)
at org.apache.jackrabbit.spi2dav.RepositoryServiceImpl.isGranted(RepositoryServiceImpl.java:904)
at org.apache.jackrabbit.jcr2spi.WorkspaceManager.canRead(WorkspaceManager.java:695)
at org.apache.jackrabbit.jcr2spi.state.ItemStateValidator.checkIsWritable(ItemStateValidator.java:199)
at org.apache.jackrabbit.jcr2spi.state.ItemStateValidator.checkRemoveItem(ItemStateValidator.java:431)
at org.apache.jackrabbit.jcr2spi.state.SessionItemStateManager.visit(SessionItemStateManager.java:282)
at org.apache.jackrabbit.jcr2spi.operation.Move.accept(Move.java:89)
at org.apache.jackrabbit.jcr2spi.state.SessionItemStateManager.execute(SessionItemStateManager.java:215)
at org.apache.jackrabbit.jcr2spi.SessionImpl.move(SessionImpl.java:323)
at Client.main(Client.java:32)
Caused by: org.apache.jackrabbit.webdav.DavException: Internal Server Error
at org.apache.jackrabbit.webdav.client.methods.DavMethodBase.getResponseException(DavMethodBase.java:165)
at org.apache.jackrabbit.webdav.client.methods.DavMethodBase.checkSuccess(DavMethodBase.java:174)
at org.apache.jackrabbit.spi2dav.RepositoryServiceImpl.isGranted(RepositoryServiceImpl.java:876)
... 8 more
Есть идеи, что случилось? Это проблема с моим кодом или средой?
3 ответа
У меня такая же проблема. Я решил это, используя метод перемещения объекта Workspace вместо объекта Session:
getSession().getWorkspace().move(node.getPath(), parentPath + newName);
Это определенно проблема с jackrabbit-spi2dav - версия 2.7.2. Его не было в версии 2.5.2.
Обход Falcon работал для меня на Jackrabbit 2.7.0. Я думаю, что сообщалось как исправлено как часть JCR-3364. Я только что попробовал с Jackrabbit 2.7.3 и Session.move и Workspace.move работают как положено.
Как и в приведенном ниже отчете об ошибке, пользователь, выполняющий перемещение, не имел доступа на чтение к полному дереву источника и назначения. Версия 2.7.0 по ошибке требовала доступа на чтение / удаление / добавление к полному дереву, а не только к перемещаемым узлам и родителям.