节点标识,同时删除
我复制使用session.getWorkspace().copy(sourceNode.getPath(), destinationNode.getPath())
节点标识,同时删除
此操作为即时据我所知变化坚持兔崽子节点未找到。但是,当我试图使用session.getNodeByIdentifier("nodeId of copied node")
来获取复制的节点以删除它时,它会给出ItemNotFoundException。造成该错误的原因是复制节点失去了复制过程中的mix:referenceable
属性,导致getNodeByIdentifier失败。
问题是如何将mix:referenceable
属性设置为复制节点,因为我无法在复制操作后从会话中获取节点。有人可以帮我解决这个问题吗?
UPDATE:
CODE:
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();
例外:在线程 “主要” javax.jcr.InvalidItemStateException
例外:无法更新过时的项目: item.save() at org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerO bject.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。运行(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(StreamRemoteC all.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(来源不明) 在org.apache.jackrabbit.rmi.client.ClientSession.save(ClientSession.java:272)
请注意,我用的JCR 2.0另外,如果我将代码更改为,代码工作正常,但我无法从会话中找到节点标识符以删除相同的问题。
你为什么要在目的地创建一个节点,然后复制到同一个地方?我认为这个陈旧的例外是因为copy
的调用已经更新了底层节点,使得destNode
引用陈旧/过时。
只需删除该addNode
然后像做...
String destPath = "Copy_Test_" + System.currentTimeMillis()";
session.getWorkspace().copy(srcNode.getPath(), destPath);
Node destNode = session.getPath(destPath);
由于@TedTrippin指出的问题是与创建这是不是必需的复制前一个目的地节点。作为复制的一部分,节点被创建。所以我的最终工作代码如下:
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");
String destNodeName = "Copy_Test";
session.getWorkspace().copy(srcNode.getPath(),appNode.getPath() + "/" + destNodeName);
Node destNode = appNode.getNode(destNodeName);
destNode.addMixin(MIX_VERSIONABLE);
destNode.addMixin(MIX_LOCKABLE);
destNode.addMixin(MIX_REFERENCEABLE);
session.refresh(true);
session.save();
我有时候会反感。谢谢你的答案。 – Gandhi