Dependency injection 将无状态本地EJB(3.1)注入WebLogic 12c中的@WebComponent无法工作

Dependency injection 将无状态本地EJB(3.1)注入WebLogic 12c中的@WebComponent无法工作,dependency-injection,ejb-3.1,servlet-3.0,weblogic12c,Dependency Injection,Ejb 3.1,Servlet 3.0,Weblogic12c,我有一个Java EE 6 War项目,包含以下内容: 声明为so的EJB(它也是一个JAX-RS服务): 声明如下的网络组件: @WebServlet(urlPatterns="/initDbData") public class DataInitListener extends HttpServlet { @EJB private BooksListEJB booksListEJB; WEB-INF文件夹中的空beans.xml文件 当我在WebLogic 12c中部署

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

声明为so的EJB(它也是一个JAX-RS服务):

声明如下的网络组件:

@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

EJB3.1中的
添加了新的Bean视图-LocaBean。您可以开发bean,而无需实现任何接口。该bean视图是“无接口视图”,用@LocalBean注释并由classname注入。有些bean实现了一些本地接口,并且具有“本地视图”,应该通过本地接口注入。在代码中混合了无接口视图bean和本地视图bean。您应该将@LocalBean注释删除为@Sam应答

已更新

我在WebLogicServer12.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定义):

答复:

Hello, world
The servlet has received a GET. This is the reply:Hello, world
此外,您的演示servlet还可以通过url访问:

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

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

默认情况下,Oracle WebLogic Server将
资源
用作servlet上的链接。请阅读有关所有支持的部署变体的信息。

请删除“@LocalBean”。如果问题仍然存在,请暂时删除Jax RS注释。为了调试,谢谢,就这样。我最终实际做的是删除[at]本地(bookslistjb.class)以及EJB类实现此接口的事实。如果我从EJB中删除[at]LocalBean,它将不再作为JAX-RS服务工作(不确定这是否正常,或者是WebLogic的一个怪癖)。无论如何,你是对的,在同一个EJB上使用[at]LocalBean和[at]Local毫无意义。我尝试构建一些原型,它对我来说很好。请阅读我的帖子更新。非常感谢您的努力和细节!我试过类似于你建议的东西,效果很好!
http://[host]:[port]/[appcontext]/demoservlet
The servlet has received a GET. This is the reply:Hello, world