2014-02-19 37 views
1

我有一个包含一个Java EE 6战项目如下:注入无状态本地EJB(3.1)到@WebComponent中的WebLogic 12c中不工作

一个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的指令/标准?

+0

请删除“@LocalBean” – Sam

+0

如果问题仍然存在,请暂时删除Jax-RS注释。为了调试的缘故。 – Sam

回答

1

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

更新

我测试了的WebLogic Server 12.1.1.0上。

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

package ejbrest; 

public interface SessionEJBLocal { 
    public String hello(); 
} 

然后创建一个EJB与REST风格的注释:

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

部署描述符,网页。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(); 
    } 
} 

部署后,您可以尝试打电话给你的RESTful服务网址:

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

响应:

Hello, world 

而且,您的演示servlet将是accessable通过网址:

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

响应:

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

默认情况下,Oracle WebLogic服务器使用resources作为新泽西州的servlet的链接。请阅读the official documentation以了解所有支持的部署变体。

+0

谢谢,就是这样。我最终做的是除去[at] Local(BooksListEJB.class)以及EJB类实现此接口的事实。如果我从EJB中删除[at] LocalBean,它将不再作为JAX-RS服务(不确定这是否正常,或者是WebLogic怪癖)。无论如何,你是对的,在同一个EJB上使用[在] LocalBean和[at] Local是没有意义的。 –

+0

我试过建立一些原型,它对我来说工作正常。请阅读我的帖子更新。 – samolisov

+0

非常感谢您的努力和细节!我试过类似于你的建议,而且效果很好! –

相关问题