Frage

I have a Java EE 6 War project containing the following:

An EJB declared as so (it's also a JAX-RS Service):

@Path("/booksList")

@Produces("application/json")

@Stateless

@LocalBean

@Local(BooksListEJB.class)

public class BooksListEJBImpl implements BooksListEJB

A WebComponent declared as so:

@WebServlet(urlPatterns="/initDbData")

public class DataInitListener extends HttpServlet {

    @EJB
    private BooksListEJB booksListEJB;

An empty beans.xml file in the WEB-INF folder

When I deploy it in WebLogic 12c, I get the following error:

<Warning> <weblogic.jaxrs.onwls.deploy.ejb.provider.EJBComponentProviderFactory> <BEA-000000> <An instance of EJB class com.shivandragon.jee6TestService.ejb.impl.BooksListEJBImpl could not be looked up using simple form name. Attempting to look up using the fully-qualified form name.
javax.naming.NameNotFoundException: While trying to look up comp/env/BooksListEJBImpl in /app/webapp/jee6Test-service-0.1-SNAPSHOT.war/2039754748.; remaining na
me 'comp/env/BooksListEJBImpl'
        at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1180)
        at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:146)
        at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:253)
        at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:426)
        at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
        Truncated. see log file for complete stacktrace

I've looked similar questions, and found the suggestion to add @ManagedBean to the servlet. Tried that but had the same error.

My question is:

Shouldn't this work, am I misusing some Java EE 6 directive/standard?

War es hilfreich?

Lösung

In EJB 3.1 have been added new Bean view - LocaBean. You can develop a bean without need implement any inerfaces. That beans view is "no-interface view", annotated with @LocalBean and injected by classname. There are beans that implemented some local interfaces and has "local view" and should be injected via local interface. In your code you mixed no-interface view bean and local view bean. You should delete the @LocalBean annotation as @Sam answered.

Updated

I test it on WebLogic Server 12.1.1.0.

Create a simple interface with one method:

package ejbrest;

public interface SessionEJBLocal {
    public String hello();
}

Then create a EJB with the RESTful annotations:

package ejbrest;

// ... imports

@Path("/booksList")
@Produces("application/json")
@Stateless
@Local(SessionEJBLocal.class)
public class SessionEJBBean implements  SessionEJBLocal {
    public SessionEJBBean() {
    }

    @Override
    @GET
    public String hello() {
        return "Hello, world";
    }
}

The deployment descriptor, web.xml (you can see it does not have any servlet definitions):

<?xml version = '1.0' encoding = 'UTF-8'?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">     
</web-app>

You can create a servlet for the local bean injection demo:

package ejbrest;

// ... imports 

@WebServlet(name = "DemoServlet", urlPatterns = { "/demoservlet" })
public class DemoServlet extends HttpServlet {
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";

    @EJB
    private SessionEJBLocal ejb;

    public void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>DemoServlet</title></head>");
        out.println("<body>");
        out.println("<p>The servlet has received a GET. This is the reply: " + 
            ejb.hello() + "</p>");
        out.println("</body></html>");
        out.close();
    }
}

After deployment you can try call your RESTful service by url:

http://[host]:[port]/[appcontext]/resources/booksList

Response:

Hello, world

Also, your demo servlet will be accessable by url:

http://[host]:[port]/[appcontext]/demoservlet

Response:

The servlet has received a GET. This is the reply:Hello, world

By default Oracle WebLogic Server use resources as link on Jersey servlet. Please read the official documentation for informs about all supported deployments variants.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top