Uploaded image for project: 'OFBiz'
  1. OFBiz
  2. OFBIZ-6808

Calling Groovy as Event generates error when delegator.find used

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 16.11.01, Trunk
    • Fix Version/s: 14.12.01, 15.12.01, 13.07.04
    • Component/s: framework
    • Labels:
      None

      Description

      We are using Groovy as event in the controller request, everything works fine for us but as we used delegator.find()
      it generates the following error

      ERROR: Cannot do a find that returns an EntityListIterator with no transaction in place. Wrap this call in a transaction.
           [java] java.lang.Exception: Stack Trace
           [java] 	at org.ofbiz.entity.GenericDelegator.find(GenericDelegator.java:1757) [ofbiz-entity.jar:?]
           [java] 	at org.ofbiz.entity.Delegator$find.call(Unknown Source) [ofbiz-entity.jar:?]
           [java] 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at ProductInventory$_run_closure1.doCall(ProductInventory.groovy:18) [script:?]
           [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_60]
           [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_60]
           [java] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_60]
           [java] 	at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_60]
           [java] 	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at groovy.lang.Closure.call(Closure.java:423) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at groovy.lang.Closure.call(Closure.java:439) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1324) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1296) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.dgm$147.invoke(Unknown Source) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) [groovy-all-2.2.1.jar:2.2.1]
           [java] 	at ProductInventory.run(ProductInventory.groovy:11) [script:?]
           [java] 	at org.ofbiz.webapp.event.GroovyEventHandler.invoke(GroovyEventHandler.java:107) [ofbiz-webapp.jar:?]
           [java] 	at org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:763) [ofbiz-webapp.jar:?]
           [java] 	at org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:476) [ofbiz-webapp.jar:?]
           [java] 	at org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) [ofbiz-webapp.jar:?]
           [java] 	at org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:89) [ofbiz-webapp.jar:?]
           [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) [servlet-api-3.0.jar:?]
           [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-3.0.jar:?]
           [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.ofbiz.webapp.control.ContextFilter.doFilter(ContextFilter.java:349) [ofbiz-webapp.jar:?]
           [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) [tomcat-7.0.65-catalina.jar:7.0.65]
           [java] 	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
           [java] 	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
           [java] 	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
           [java] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_60]
           [java] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_60]
           [java] 	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
           [java] 	at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
      

      -----------------------------------------------------------------------------------------------------------------------------------------------------------

      Reason:

      Since we are using find method of GenericDelegator.java
      As per the code implementation it required the transaction should exist

         if (!TransactionUtil.isTransactionInPlace()) {
      

      if not, it generate error

      ERROR: Cannot do a find that returns an EntityListIterator with no transaction in place. Wrap this call in a transaction.

      -----------------------------------------------------------------------------------------------------------------------------------------------------------

      Possible Solution:

      The one possible solution could be to initialize the transaction when the groovy is called as event and commit the transaction after the completion.
      The following code base at the starting and ending of GroovyEventHandler.java can resolve the issue.

         // At begining
          boolean beganTransaction = false;
          if (!TransactionUtil.isTransactionInPlace()) { 
              beganTransaction = TransactionUtil.begin(); 
          }
      
         // At End
         if (beganTransaction) { 
             TransactionUtil.commit(); 
         }
      

        Attachments

        1. OFBIZ-6808.patch
          6 kB
          Swapnil Mane

          Activity

            People

            • Assignee:
              jleroux Jacques Le Roux
              Reporter:
              swapnilmmane Swapnil Mane
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: