在WebLogic 12c中将无状态本地EJB(3.1)注入@WebComponent不起作用

时间:2014-02-19 23:34:31

标签: dependency-injection ejb-3.1 servlet-3.0 weblogic12c

我有一个Java EE 6 War项目,其中包含以下内容:

如此声明的EJB(它也是JAX-RS服务):

@Path("/booksList")

@Produces("application/json")

@Stateless

@LocalBean

@Local(BooksListEJB.class)

public class BooksListEJBImpl implements BooksListEJB

声明为的WebComponent:

@WebServlet(urlPatterns="/initDbData")

public class DataInitListener extends HttpServlet {

    @EJB
    private BooksListEJB booksListEJB;

WEB-INF文件夹中的空beans.xml文件

当我在WebLogic 12c中部署它时,出现以下错误:

<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

我看了类似的问题,并找到了将@ManagedBean添加到servlet的建议。试过但却有同样的错误。

我的问题是:

不应该这样做,我是否滥用了一些Java EE 6指令/标准?

1 个答案:

答案 0 :(得分:1)

在EJB 3.1中添加了新的Bean视图 - LocaBean。你可以开发一个bean,而不需要实现任何工作。该bean视图是“无接口视图”,使用@LocalBean注释并通过classname注入。有些bean实现了一些本地接口并具有“本地视图”,应该通过本地接口注入。在您的代码中,您混合了无接口视图bean和本地视图bean。您应该删除@SocalBean注释@Sam应答。

<强>更新

我在 WebLogic Server 12.1.1.0 上测试它。

使用一种方法创建一个简单的界面:

package ejbrest;

public interface SessionEJBLocal {
    public String hello();
}

然后使用RESTful注释创建EJB:

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";
    }
}

部署描述符,web.xml(您可以看到它没有任何servlet定义):

<?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>

您可以为本地bean注入演示创建一个servlet:

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();
    }
}

部署后,您可以尝试通过url调用RESTful服务:

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

响应:

Hello, world

此外,你的演示servlet可以通过url访问:

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

响应:

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

默认情况下,Oracle WebLogic Server使用resources作为Jersey servlet上的链接。请阅读the official documentation以获取有关所有支持的部署变体的信息。