You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Chris Juettner <cj...@go-integral.com> on 2008/01/09 16:14:13 UTC

CallService throws cannot locate service by name

I'm upgrading an old OFBiz based application to the latest Apache version and I discovered a problem with a custom simple method that no longer works.  
I have traced the problem to the CallService class and a change made last year.  I'm not sure of the protocol to open a Jira Tracker but here's the details.

Simple Method declaration:

<simple-method method-name="getDataMaps" short-description="Call a series of services to assemble a map hierarchy" login-required="false">
  <iterate-map map-name="parameters.operationMap" key-name="serviceName" value-name="resultMap">
        <clear-field field-name="serviceMap"/>
        <set-service-fields service-name="${serviceName}" map-name="parameters" to-map-name="serviceMap"/>
        <call-service service-name="${serviceName}" in-map-name="serviceMap">
          <results-to-map map-name="${resultMap}"/>
        </call-service>
        <set field="dataMap.${resultMap}" from-field="${resultMap}"/>
</iterate-map>


When this simple method executes it fails (partial debug log)
2008-01-08 15:40:41,000 (http-0.0.0.0-8443-Processor4) [Log.java:94 :INFO ] *****getDataMaps parameters.operationMap [findProjectDetails=projectDetails, findCustomAttachment=customAttachment]
2008-01-08 15:40:41,000 (http-0.0.0.0-8443-Processor4) [Log.java:94 :INFO ] *****calling service findProjectDetails
2008-01-08 15:40:44,500 (http-0.0.0.0-8443-Processor4) [CallService.java:242:ERROR] 
---- exception report ----------------------------------------------------------
Exception: org.ofbiz.service.GenericServiceException
Message: Cannot locate service by name (${serviceName})
---- stack trace ---------------------------------------------------------------
org.ofbiz.service.GenericServiceException: Cannot locate service by name (${serviceName})
org.ofbiz.service.DispatchContext.getModelService(DispatchContext.java:190)
org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:143)
org.ofbiz.minilang.method.callops.CallService.exec(CallService.java:239)
org.ofbiz.minilang.SimpleMethod.runSubOps(SimpleMethod.java:931)


The change is in CallService method exec(MethodContext methodContext) in the block that checks for requiring a new transaction and timeout.

If you debug "result = methodContext.getDispatcher().runSync(this.serviceName, inMap);" and inspect "this.serviceName" you will get "${serviceName}"
If you inspect "serviceName" you will get "findProjectDetails" which is desired.

To fix my version, I changed the code back to the way "serviceName" used to be:
result = methodContext.getDispatcher().runSync(serviceName, inMap);

Chris Juettner
Integral Business Solutions


Re: CallService throws cannot locate service by name

Posted by Adrian Crum <ad...@hlmksw.com>.
Fixed, rev 610440. Thanks Chris!

-Adrian

Chris Juettner wrote:
> I'm upgrading an old OFBiz based application to the latest Apache version and I discovered a problem with a custom simple method that no longer works.  
> I have traced the problem to the CallService class and a change made last year.  I'm not sure of the protocol to open a Jira Tracker but here's the details.
> 
> Simple Method declaration:
> 
> <simple-method method-name="getDataMaps" short-description="Call a series of services to assemble a map hierarchy" login-required="false">
>   <iterate-map map-name="parameters.operationMap" key-name="serviceName" value-name="resultMap">
>         <clear-field field-name="serviceMap"/>
>         <set-service-fields service-name="${serviceName}" map-name="parameters" to-map-name="serviceMap"/>
>         <call-service service-name="${serviceName}" in-map-name="serviceMap">
>           <results-to-map map-name="${resultMap}"/>
>         </call-service>
>         <set field="dataMap.${resultMap}" from-field="${resultMap}"/>
> </iterate-map>
> 
> 
> When this simple method executes it fails (partial debug log)
> 2008-01-08 15:40:41,000 (http-0.0.0.0-8443-Processor4) [Log.java:94 :INFO ] *****getDataMaps parameters.operationMap [findProjectDetails=projectDetails, findCustomAttachment=customAttachment]
> 2008-01-08 15:40:41,000 (http-0.0.0.0-8443-Processor4) [Log.java:94 :INFO ] *****calling service findProjectDetails
> 2008-01-08 15:40:44,500 (http-0.0.0.0-8443-Processor4) [CallService.java:242:ERROR] 
> ---- exception report ----------------------------------------------------------
> Exception: org.ofbiz.service.GenericServiceException
> Message: Cannot locate service by name (${serviceName})
> ---- stack trace ---------------------------------------------------------------
> org.ofbiz.service.GenericServiceException: Cannot locate service by name (${serviceName})
> org.ofbiz.service.DispatchContext.getModelService(DispatchContext.java:190)
> org.ofbiz.service.GenericDispatcher.runSync(GenericDispatcher.java:143)
> org.ofbiz.minilang.method.callops.CallService.exec(CallService.java:239)
> org.ofbiz.minilang.SimpleMethod.runSubOps(SimpleMethod.java:931)
> 
> 
> The change is in CallService method exec(MethodContext methodContext) in the block that checks for requiring a new transaction and timeout.
> 
> If you debug "result = methodContext.getDispatcher().runSync(this.serviceName, inMap);" and inspect "this.serviceName" you will get "${serviceName}"
> If you inspect "serviceName" you will get "findProjectDetails" which is desired.
> 
> To fix my version, I changed the code back to the way "serviceName" used to be:
> result = methodContext.getDispatcher().runSync(serviceName, inMap);
> 
> Chris Juettner
> Integral Business Solutions
> 
>