EJB Injection error

16,019

You normaly MUST define a local interface, e. g.

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

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

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

PS: Code is untested but should help.

Share:
16,019
Mehdi
Author by

Mehdi

Mehdi is a reliable, enthusiastic, and resourceful software engineer with over a decade of experience in consulting, architecting, designing, and developing middle/enterprise-scale software solutions.

Updated on June 24, 2022

Comments

  • Mehdi
    Mehdi almost 2 years

    I have an EAR file (JEE6) containing one ejb-jar (sample-ejb) file and one war file (sample-web). 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 inject TestEjb to StartupEjb or TestListener:

    @EJB
    private TestEjb testEjb;
    

    I get 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 can not find TestEjb!

    By the way, when I create a remote interface for TestEjb and use that for injection it works well! But I don't want to define remote interfaces and I want to use EJB with no interface. I don't think that I must define a remote interface for this simple usecase!

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

    It's a simple Maven project created using NetBeans.