Uploaded image for project: 'Geronimo'
  1. Geronimo
  2. GERONIMO-3452

Stateless Session EJBs cannot contain a remove() method

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0.x, 2.1
    • Fix Version/s: 2.0.2, 2.1
    • Component/s: OpenEJB
    • Security Level: public (Regular issues)
    • Labels:
      None
    • Environment:

      Windows XP SP2

      Description

      We have a stateless session bean that contains a "remove(...)" method that takes in a specific type of array as a parameter. It seems that the EJBObjectProxyHandler confuses this custom business method with the Entity Bean "remove(...)" method. Once the logic sees that a method called "remove" is being called, it assumes that it is a "special" method instead of a business method. Here is a stack trace up to the point where this piece of logic occurs:

      Thread [http-80-3] (Suspended)
      StatelessEjbObjectHandler(EjbObjectProxyHandler)._invoke(Object, Class, Method, Object[]) line: 62
      StatelessEjbObjectHandler(BaseEjbProxyHandler).invoke(Object, Method, Object[]) line: 320
      Jdk13InvocationHandler.invoke(Object, Method, Object[]) line: 49
      $Proxy173.remove(FcModelKey[]) line: not available
      FCRemoveTest.test() line: 75
      ....

      The following code in the EjbObjectProxyHandler looks up the name of the method from the dispatch table and sees that it is a "special" method name. However, this really only applies to Entity beans and not Session Beans. Therefore, case 4 is executed, and the StatelessEjbObjectHandler.remove(...) method is called, which is empty and only returns null.

                  Integer operation = (Integer) dispatchTable.get(m.getName());
      
                  if (operation == null) {
                      retValue = businessMethod(interfce, m, a, p);
                  } else {
                      switch (operation.intValue()) {
                          case 1:
                              retValue = getHandle(m, a, p);
                              break;
                          case 2:
                              retValue = getPrimaryKey(m, a, p);
                              break;
                          case 3:
                              retValue = isIdentical(m, a, p);
                              break;
                          case 4:
                              retValue = remove(interfce, m, a, p);
                              break;
                          case 5:
                              retValue = getEJBHome(m, a, p);
                              break;
                          case 6:
                              retValue = getEJBLocalHome(m, a, p);
                              break;
                          default:
                              throw new RuntimeException("Inconsistent internal state");
                      }
                  }
      
                  return retValue;
      

      We have not run into this problem with JBoss and Weblogic. I do not believe having a method called "remove" on a Stateless Session bean is in violation of any spec, so this should work.

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              ananner Aman Nanner
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: