0
votes

I was wondering if EJB specifications allow to access a stateful session bean over a looked up stateful session bean.

The reason why I'm asking is, that Jboss EAP 7.0 has no problems with it, but Websphere throws a NullPointerException when I try to access the bean.

For example:

@Stateful
public class SampleServiceRoot implements SampleServiceRootRemote {

    @EJB
    protected SampleServiceChildLocal servicechild;

    @Override
    public SampleServiceChildLocal getServiceChild(){
        return servicechild;
    }
}

@Stateful
public class SampleServiceChild implements SampleServiceChildLocal,SampleServiceChildRemote{

    @Override       
    public void anyMethod(){
      //DO Anything
    }
}

When I do a remote lookup to the SampleServiceRootRemote and call "getServiceChild()" and try to call "anyMethod()" on it, it works on JBoss EAP 7.0 but on Websphere I get a NullPointerException.

So I was wondering if this is a Bug in Websphere or is it forbidden by EJB Specification and I was just lucky with JBoss EAP 7.0?

2

2 Answers

0
votes

The EJB specification does require this scenario to work, depending on some configuration options; there are configuration options that may disable it.

The fact that you are seeing a NullPointerException indicates that WebSphere is not aware of the @EJB annotation on the field in the SampleServiceRoot class. Per the EJB specification, an instance of SampleServiceRoot cannot be created if the @EJB annotation cannot be resolved. Since an instance of SampleServiceRoot has been created, then one of the following has likely occurred:

1 - The application performed a new SampleServiceRoot rather than looking it up in JNDI. This doesn't sound like your problem, but good to double check.

2 - The application contains an ejb-jar.xml with the setting metadata-complete="true". When this is set, WebSphere will not look for annotations, and so will not see or process the @EJB annotation. Either change the setting to "false" or add the <ejb-ref> or <ejb-local-ref> to the ejb-jar.xml file.

3 - The application does not have metadata-complete="true", however when the application is deployed to WebSphere the option to set metadata-complete was selected. This option will change the metadata-complete setting to "true". Stop using this option, or add the <ejb-ref> or <ejb-local-ref> to the ejb-jar.xml file.

4 - The EJB is contained in a WAR module at level 2.4 or older. In WebSphere, annotations for older modules are not processed.

5 - The application includes a copy of the javax.ejb.EJB class. WebSphere provides the javax.ejb.EJB class, and it is loaded by the WebSphere runtime classloader. If the application also contains the javax.ejb.EJB class on the application classpath, then another instance will be loaded by the application classloader, and it will not match the instance used by the EJB Container. There should be a warning in the logs if this has occurred.

So yes, your scenario is required to be supported; however the specification does allow configurations that disable it. You just need to identify which configuration / packaging option has caused WebSphere to not see the @EJB annotation.

0
votes

Thanks for the answer,

we tried to move the declarations of the Local-Interface to the Remote Interface of the SampleServiceChild. Also we did not use @EJB annotation. We managed it with doing a lookup of the SampleServiceChild over the InitialContext. Now it works