2017-09-16 73 views
1

我复制使用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另外,如果我将代码更改为​​,代码工作正常,但我无法从会话中找到节点标识符以删除相同的问题。

回答

1

你为什么要在目的地创建一个节点,然后复制到同一个地方?我认为这个陈旧的例外是因为copy的调用已经更新了底层节点,使得destNode引用陈旧/过时。

只需删除该addNode然后像做...

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

我有时候会反感。谢谢你的答案。 – Gandhi

0

由于@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();