【问题标题】:How to get a companyHome for nodeService.getChildAssocs in Alfresco?如何在 Alfresco 中为 nodeService.getChildAssocs 获取 companyHome?
【发布时间】:2014-12-28 15:59:36
【问题描述】:

实际上,我正在尝试从 alfresco 的当前任务中获取文件,但找不到任何关于如何获取当前节点的解密。我发现我可以使用这个来获得我需要的所有子节点引用:

List<ChildAssociationRef> children = nodeService.getChildAssocs(companyHome)

但是here 我只看到我需要NodeRef nodeRef, QNamePattern typeQNamePattern, QNamePattern qnamePattern 这些至少是3 个参数,其中一个也是NodeRef,结果我需要一个NodeRef 来获取NodeRef。据我了解,最后一个 nodeRef 类似于父文件夹,但我也不知道如何获取它。也可以像这样通过 PATH 获取 NodeRef:

StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
   ResultSet rs = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE, "PATH:\"/app:company_home/app:user_homes/sys:boris/cm:mypics\"");
   NodeRef companyHomeNodeRef = null;
   try
   {
       if (rs.length() == 0)
       {
           throw new AlfrescoRuntimeException("Didn't find Company Home");
       }
       companyHomeNodeRef = rs.getNodeRef(0);
   }
   finally
   {
       rs.close();
   }

但我无法对路径进行硬编码,因为 Alfresco 可以在服务器或其他服务器上的任何位置运行。 也可以像这样使用 Lucene 获取 NodeRef:

        SearchParameters sp = new SearchParameters();
        sp.addStore(getStoreRef());
        sp.setLanguage(SearchService.LANGUAGE_LUCENE);
        sp.setQuery("TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"");
        ResultSet results = null;
        try
        {
            results = serviceRegistry.getSearchService().query(sp);
            for(ResultSetRow row : results)
            {
                NodeRef currentNodeRef = row.getNodeRef();
                ...
            }
        }
        finally
        {
            if(results != null)
            {
                results.close();
            }
        }  

但这将返回我所有存在于露天的节点。 也许有可能改进其中一种方法来实现我的愿望?或者还有其他方法吗?

UPD:这是我想要获取和使用节点的代码部分:

        NodeService nodeService = getServiceRegistry().getNodeService();                    
        ContentService contentService = getServiceRegistry().getContentService();

        List<ChildAssociationRef> children = nodeService.getChildAssocs(companyHome);
         if (children.isEmpty()) {
            throw new AlfrescoRuntimeException("Workflow bpm_package does not contain any files");
        }
         for(ChildAssociationRef childAssoc: children){
                NodeRef childNodeRef = childAssoc.getChildRef();
                FileBinary = getFileBinary(childNodeRef, contentService);

我将进一步执行文件转换。希望这会对情况有所帮助。

【问题讨论】:

  • 您能否详细说明以下内容 1.“其中一个也是 NodeRef,结果我需要一个 NodeRef 来获取 NodeRef。” 2.对于这个标题“如何在 Alfresco 中为 nodeService.getChildAssocs 获取 companyHome”。我会说 app:companyhome 将返回 lucene 将返回 companyhome。 3.其实我正在alfresco中尝试从当前任务中获取文件,但是找不到任何关于如何获取当前节点的描述。-->非常混乱
  • NodeRef=文件,不是吗?要对创建任务时附加的文件执行任何操作,我需要这些文件。我不明白如何得到它们。所有示例都与上下文无关,无法获取这些方法的参数
  • 还是看不懂?能把整个java代码放上来吗?都是你自己创造的东西。
  • @Krutik Jayswal 更新了问题
  • 我想要完整的文件,包括弹簧配置、工作流定义和您用于此的所有其他配置。

标签: java lucene alfresco activiti


【解决方案1】:

试试这个方法:

ServiceRegistry serviceRegistry = (ServiceRegistry) context.getBean("ServiceRegistry");

Node rootNode = session.getRootNode();
//obtaining root node company home 
Node companyHome = rootNode.getNode("app:company_home");
// getting noderef of company home node
NodeRef companyHomeRef = JCRNodeRef.getNodeRef(companyHome);

List<ChildAssociationRef> children = nodeService.getChildAssocs(companyHomeRef);
   for (ChildAssociationRef childAssoc : children) {
       NodeRef childNodeRef = childAssoc.getChildRef();
       // Use childNodeRef here.
   }

通过这种方式,您以编程方式获取 CompanyHome 节点的 NodeRef,并通过它获得 Company Home 下的子节点列表。

使用这些导入:

import org.alfresco.jcr.api.JCRNodeRef;
import org.alfresco.service.ServiceRegistry;
import javax.jcr.Node;
import javax.jcr.Session;
import org.springframework.context.ApplicationContext;

【讨论】:

  • 看起来不错,但这里的会话和上下文是什么?和 eclipce 还说方法 getNode(String) 未定义类型 Node
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多