我使用 Jackrabbit 复制了一个节点session.getWorkspace().copy(sourceNode.getPath(), destinationNode.getPath())
据我所知,此操作更改会立即持续存在。但是,当我尝试使用 获取复制的节点以将其删除时session.getNodeByIdentifier("nodeId of copied node")
,它会给出 ItemNotFoundException。该错误的原因是复制的节点mix:referenceable
在复制期间丢失了属性,这导致 getNodeByIdentifier 失败。
问题是如何将mix:referenceable
属性设置为复制的节点,因为复制操作后我无法从会话中获取节点。有人可以帮我解决这个问题吗?
更新:
代码:
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 中的异常:无法更新陈旧的项目:org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:111) 中的 item.save() 在 org.apache。 jackrabbit.rmi.server.ServerSession.save(ServerSession.java:265) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl。在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) 在 sun.rmi.transport.Transport 的 java.lang.reflect.Method.invoke(Method.java:498) 调用(DelegatingMethodAccessorImpl.java:43) $1.run(Transport.java:200) 在 sun.rmi.transport.Transport$1.run(Transport.java:197) 在 java.security.AccessController。在 sun.rmi.transport.Transport.serviceCall(Transport.java:196) 在 sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 在 sun.rmi.transport.tcp 的 doPrivileged(Native Method)。 TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) 在 java.security.AccessController.doPrivileged(Native Method) 在 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)
请注意,我使用的是 JCR 2.0 此外,如果我将代码更改为session.refresh(false)
,代码工作正常,但我无法从会话中找到节点标识符来删除相同的节点标识符,这是我最初的问题。