删除时找不到在Jackrabbit中复制的节点的节点标识符 [英] Node Identifier of copied node in Jackrabbit not found while deleting

查看:163
本文介绍了删除时找不到在Jackrabbit中复制的节点的节点标识符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用session.getWorkspace().copy(sourceNode.getPath(), destinationNode.getPath())

据我所知,此操作更改会立即保留.但是,当我尝试使用session.getNodeByIdentifier("nodeId of copied node")获取要删除它的复制节点时,它给出了ItemNotFoundException.该错误的原因是复制期间复制的节点丢失了mix:referenceable属性,这导致getNodeByIdentifier失败.

This operation changes are persisted instantly as far as I know. But when I tried to get the copied node for deleting it using session.getNodeByIdentifier("nodeId of copied node"), it gives ItemNotFoundException. The reason for that error is that the copied node loses is mix:referenceable property during copy which causes getNodeByIdentifier to fail.

问题是如何在复制操作后无法从会话中获取节点,如何将mix:referenceable属性设置为复制的节点.有人可以帮我这个忙吗?

The question is how do I set the mix:referenceable property to copied node as I m not able to get the node from session after copy operation. Could someone help me out on this?

更新:

代码:

    Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID");
    if(srcNode == null) {
        System.out.println("File not found");
    }

    Node rootNode = session.getRootNode();
    Node appNode  = rootNode.getNode("JACKRABBIT");
    Node destNode = appNode.addNode("Copy_Test_"+System.currentTimeMillis(),"nt:file");

    session.getWorkspace().copy(srcNode.getPath(),destNode.getPath());
    destNode.addMixin(MIX_VERSIONABLE);
    destNode.addMixin(MIX_LOCKABLE);
    destNode.addMixin(MIX_REFERENCEABLE);
    destNode.addNode(DMSConstants.RESOURCE_NODE,"nt:unstructured");
    session.refresh(true);
    session.save();

例外:

线程"main"中的异常javax.jcr.InvalidItemStateException:无法更新陈旧的项目:item.save() 在org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:111) 在org.apache.jackrabbit.rmi.server.ServerSession.save(ServerSession.java:265) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498) 在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) 在sun.rmi.transport.Transport $ 1.run(Transport.java:200) 在sun.rmi.transport.Transport $ 1.run(Transport.java:197) 在java.security.AccessController.doPrivileged(本机方法) 在sun.rmi.transport.Transport.serviceCall(Transport.java:196) 在sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:826) 在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0(TCPTransport.java:683) 在java.security.AccessController.doPrivileged(本机方法) 在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:682) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:748) 在sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276) 在sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253) 在sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) 在org.apache.jackrabbit.rmi.server.ServerXASession_Stub.save(未知来源) 在org.apache.jackrabbit.rmi.client.ClientSession.save(ClientSession.java:272)

Exception in thread "main" javax.jcr.InvalidItemStateException: Unable to update a stale item: item.save() at org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:111) at org.apache.jackrabbit.rmi.server.ServerSession.save(ServerSession.java:265) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) at org.apache.jackrabbit.rmi.server.ServerXASession_Stub.save(Unknown Source) at org.apache.jackrabbit.rmi.client.ClientSession.save(ClientSession.java:272)

请注意,我正在使用JCR 2.0.如果我将代码更改为session.refresh(false),该代码也可以正常工作,但是我无法从会话中找到要删除的节点标识符,这是我的原始问题.

Please note that I am using JCR 2.0 Also if I change the code to session.refresh(false), the code works fine but I m not able to find the node identifier from session for deleting the same which is my original issue.

推荐答案

为什么要在目标位置创建一个节点然后复制到同一位置?我相信陈旧的异常是因为对copy的调用已更新了基础节点,使您的destNode引用陈旧/过期.

Why are you creating a node at the destination then copying to the same place? I believe the stale exception is because the call to copy has updated the underlying node making your destNode reference stale/out-of-date.

只需删除addNode,然后执行类似...

Simply remove the addNode then do something like ...

String destPath = "Copy_Test_" + System.currentTimeMillis()";
session.getWorkspace().copy(srcNode.getPath(), destPath);
Node destNode = session.getPath(destPath);

这篇关于删除时找不到在Jackrabbit中复制的节点的节点标识符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆