无法从自定义 WCC Java 服务调用 DOC_INFO_BY_NAME

Unable to call DOC_INFO_BY_NAME from a Custom WCC Java Service

我正在为 创建自定义 Java 组件,以根据传入的 Excel 文件进行一些处理。这些文件已通过 Content ID 锁定。 应用程序在读取 excel 文件后做的第一件事就是调用 DOC_INFO_BY_NAME.

简而言之:为什么 DOC_INFO_BY_NAME 无法通过名称找到 dProcessingState,我该如何解决它?

完整详情如下


但是,当我这样做时,我收到以下错误消息:

为 'LOCALHOST16200000001' 获取 DOC_INFO 时出错。无法检索 'LOCALHOST16200000001' 的信息。无法检索文件格式信息。找不到参数 'dProcessingState'。 [详情]

发生错误。下面的堆栈跟踪显示了更多信息。

!$Error getting DOC_INFO for 'LOCALHOST16200000001'.!csUnableToGetRevInfo2,LOCALHOST16200000001!csUnableToGetFileFormatInfo!syParameterNotFound,dProcessingState
intradoc.common.ServiceException: !csUnableToGetRevInfo2,LOCALHOST16200000001!csUnableToGetFileFormatInfo
        at intradoc.server.ServiceRequestImplementor.buildServiceException(ServiceRequestImplementor.java:2176)
        at intradoc.server.Service.buildServiceException(Service.java:2404)
        at intradoc.server.Service.createServiceExceptionEx(Service.java:2398)
        at intradoc.server.Service.createServiceException(Service.java:2393)
        at intradoc.server.DocCommonHandler.getDocFormats(DocCommonHandler.java:271)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at intradoc.common.IdcMethodHolder.invokeMethod(IdcMethodHolder.java:86)
        at intradoc.common.ClassHelperUtils.executeMethodReportStatus(ClassHelperUtils.java:324)
        at intradoc.server.ServiceHandler.executeAction(ServiceHandler.java:79)
        at intradoc.server.Service.doCodeEx(Service.java:622)
        at intradoc.server.Service.doCode(Service.java:594)
        at intradoc.server.ServiceRequestImplementor.doAction(ServiceRequestImplementor.java:1693)
        at intradoc.server.Service.doAction(Service.java:566)
        at intradoc.server.ServiceRequestImplementor.doActions(ServiceRequestImplementor.java:1483)
        at intradoc.server.Service.doActions(Service.java:561)
        at intradoc.server.ServiceRequestImplementor.executeActions(ServiceRequestImplementor.java:1415)
        at intradoc.server.Service.executeActions(Service.java:547)
        at intradoc.server.ServiceRequestImplementor.doRequestInternalEx(ServiceRequestImplementor.java:958)
        at intradoc.server.ServiceRequestImplementor.executeServiceTopLevelSimple(ServiceRequestImplementor.java:1070)
        at com.lowes.content.edam.massMetaDataUpdate.service.types.ServicesWrapper.executeService(ServicesWrapper.java:139)
        at com.lowes.content.edam.massMetaDataUpdate.service.file.GetFileService.getDocInfo(GetFileService.java:478)
        at com.lowes.content.edam.massMetaDataUpdate.service.ServiceFieldMapper.getMappings(ServiceFieldMapper.java:76)
        at com.lowes.content.edam.massMetaDataUpdate.file.mapper.impl.FieldMapWorker.doInBackground(FieldMapWorker.java:107)
        at com.lowes.content.edam.massMetaDataUpdate.file.mapper.impl.FieldMapWorker.doInBackground(FieldMapWorker.java:37)
        at javax.swing.SwingWorker.call(SwingWorker.java:277)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at javax.swing.SwingWorker.run(SwingWorker.java:316)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
Caused by: intradoc.data.DataException: !syParameterNotFound,dProcessingState
        at intradoc.data.DataBinder.getEx(DataBinder.java:1258)
        at intradoc.data.DataBinder.get(DataBinder.java:1057)
        at intradoc.server.DocCommonHandler.getProcessingState(DocCommonHandler.java:277)
        at intradoc.server.DocCommonHandler.getDocFormats(DocCommonHandler.java:184)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at intradoc.common.IdcMethodHolder.invokeMethod(IdcMethodHolder.java:87)
        at intradoc.common.ClassHelperUtils.executeMethodReportStatus(ClassHelperUtils.java:324)
        at intradoc.server.ServiceHandler.executeAction(ServiceHandler.java:79)
        at intradoc.server.Service.doCodeEx(Service.java:622)
        at intradoc.server.Service.doCode(Service.java:595)
        ... 20 more

我尝试了多种调用附加服务的方法。
目前我正在使用:

public DataBinder executeService(DataBinder binder, Workspace workspace) 
       throws DataException, ServiceException 
{  
  final String serviceName = binder.getLocal(Services.IdcService);

  //check for REMOTE_USER
  String username = binder.getEnvironmentValue("REMOTE_USER");

  if ( null == username || "".equals(username.trim()))         
  {
     log.warn("username not found, searching the binder.");
     try { username = binder.get("dUser"); }
     catch (DataException de) { log.error("Unable to get Username.", de); }
     if ( null != username && !"".equals(username.trim()))            
     { binder.setEnvironmentValue("REMOTE_USER", username); }
     else { throw new IllegalStateException("Username required!"); }
  }

  //clear idcToken
  binder.getLocalData().remove("idcToken");

  log.info("About to run '" + serviceName + "' as '" + username +"'");

  try 
  {
     log.info("Calling service " + serviceName + ": " 
             + binder.getLocalData().toString());
     // Execute service
     service.createRequestImplementor();
     service.getRequestImplementor()
            .executeServiceTopLevelSimple(binder, serviceName, 
                                          service.getUserData());
     log.info("Finished calling service");
     return service.getBinder();
  } 
  catch (DataException e) 
  {
     String msg = "Unexpected Failure executing service '"+serviceName+"'";
     log.info(msg, e);
     throw e; //log and duck
  }
}

为什么 WCC 找不到 dProcessingState,我该如何解决?

您调用服务的方式相当标准,我认为这不是原因。我的第一个猜测是您的其他代码干扰了您对 DOC_INFO_BY_NAME 的调用。如果您禁用所有其他自定义代码(也许说起来容易做起来难)并在干净的组件中调用该服务,那么我认为它会起作用。第二个候选人是重新考虑您的自定义服务是否真的应该是一个文件服务。不确定这是否会影响结果,但也许值得一试。

对我来说这几乎像是一个错误。

getProcessingState()getDocFormats() 调用,后者从 DOC_INFO* 服务调用。

getProcessingState() 的代码首先检索 dProcessingState

 String curProcState = this.m_binder.get("dProcessingState");

然后,它检查这是否为空:

if (curProcState != null)

但是,它永远不会进行空检查。这是因为 DataBinder.get() 需要传入的任何键的值(在本例中为 dProcessingState。)

尝试在调用服务之前将 dProcessingState 设置为 DataBinder 中的值。

binder.setLocal("dProcessingState", "ignore");

这个问题完全是我的错。我曾试图花哨,并扩展 Databinder 以使其更易于使用。原来我的分机有问题。 回滚到默认值并仔细检查活页夹中的数据修复它。