2014-02-19 36 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

非常感謝您的努力和細節!我試過類似於你的建議,而且效果很好! –

相關問題