EJB Injection Error

I have an EAR file (JEE6) containing one ejb-jar file (sample-ejb) and one war file (sample network). Here is the structure:

sample-ear |----sample-ejb.jar | |---TestEjb.java (@Singleton) | |----sample-web |---StartupEjb.java (@Singleton,@Startup) |---TestListener.java (@WebListener) 

when I want to insert TestEjb into StartupEjb or TestListener:

 @EJB private TestEjb testEjb; 

I get the following error:

Glassfish:

 Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=com.sample.StartupEjb/testEjb,Remote 3.x interface =com.sample.TestEjb,ejb-link=null,lookup=,mappedName=,jndi-name=com.sample.TestEjb,refType=Session into class com.sample.StartupEjb: Lookup failed for 'java:comp/env/com.sample.StartupEjb/testEjb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 

Weblogic:

 Caused By: weblogic.application.naming.ReferenceResolutionException: [J2EE:160200]Error resolving ejb-ref "com.sample.StartupEjb/testEjb" from module "sample-web-1.0-SNAPSHOT.war" of application "com.sample_sample-ear_ear_1.0-SNAPSHOT". The ejb-ref does not have an ejb-link and the JNDI name of the target bean has not been specified. Attempts to automatically link the ejb-ref to its target bean failed because no EJBs in the application were found to implement the "com.sample.TestEjb" interface. Link or map this ejb-ref to its target EJB and ensure the interfaces declared in the ejb-ref are correct. 

Both Glassfish and Weblogic cannot find TestEjb!

By the way, when I create a remote interface for TestEjb and use it for injection, it works well! But I do not want to define remote interfaces, and I want to use EJB without an interface. I do not think I should define a remote interface for this simple usecase!

You can download the source code here: https://dl.dropbox.com/sh/63hn3n9y3p5ypvi/SsG9iZIvx9/sample.zip?dl=1

This is a simple Maven project created using NetBeans.

+4
source share
1 answer

You, normal, SHOULD define a local interface, for example. g.

 @Singleton @Local(PublicInterface.class) public class MyBean implements PublicInterface { ... } 

If you explicitly avoid this interface, you should mark your bean as @LocalBean:

 @Singleton @LocalBean public class MyBean { ... } 

PS: The code is not verified, but should help.

+5
source

All Articles