【问题标题】:Cannot call EJB inside Rest web service无法在 Rest Web 服务中调用 EJB
【发布时间】:2012-09-07 16:04:32
【问题描述】:

我有一个休息网络服务。在这个 REST Web 服务中,我使用@EJB 来注入一个 EJB。然后我想在我的 EJB 上调用一个函数。问题是,当我这样做时,整个事情都会爆炸。我创建了一个简单的示例来演示。

我有两个项目。一个是包含我的 EJB 的 ear 项目。

import javax.ejb.Stateless; import javax.ejb.LocalBean; /** * * @author dan */ @Stateless @LocalBean public class DummyBean { public String dummMessage(){ return "Hello World"; } }

另一个是包含我的网络服务的战争。

@Stateless @Path("resources") public class CasperMessage { private final Logger logger = Logger.getLogger(ServerMessageManager.class.getName()); @Context private UriInfo context; @EJB DummyBean db; /** * Creates a new instance of CasperMessage */ public CasperMessage() { } @PUT @Consumes("application/xml") @Produces("application/xml") @Path("/message/get") public String getMessage(String content) { //Message retVal = serverMessageManager.getMessageRecieved(message); String retVal = db.dummMessage(); return retVal; }; }

当你运行代码时,我得到以下异常:

SEVERE: EJB5070: Exception creating stateless session bean : [DummyBean] WARNING: EJB5184:A system exception occurred during an invocation on EJB DummyBean, method: public java.lang.String com.dv.business.messaging.server.DummyBean.dummMessage() WARNING: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454) at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547) at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at $Proxy207.dummMessage(Unknown Source) at com.dv.business.messaging.server.__EJB31_Generated__DummyBean__Intf____Bean__.dummMessage(Unknown Source) at com.dv.ws.CasperMessage.getMessage(CasperMessage.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

有什么想法或建议吗?这似乎是一个简单的想法,但它对我不起作用。

【问题讨论】:

    标签: java rest jakarta-ee dependency-injection ejb


    【解决方案1】:

    我用你的类创建了简单的战争 - 一切都很好。
    WAR结构

    -META-INF/MANIFEST.MF  
    -WEB-INF/sun-web.xml  
    -WEB-INF/web.xml  
    -WEB-INF/classes/com/package/CasperMessage.class  
    -WEB-INF/classes/com/package/DummyBean.class  
    -index.jsp  
    

    web.xml

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"
             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">
    
        <servlet>
            <servlet-name>ServletAdaptor</servlet-name>
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletAdaptor</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
        </web-app>  
    

    sun-web.xml

    <sun-web-app>
        <context-root>/api</context-root>
    </sun-web-app>  
    

    Glass Fish 3.1上部署,在/api/resources/message/get上发送PUT请求,得到响应

    【讨论】:

    • 您可以尝试将 DummyBean 包装为耳朵吗?那么战争和它有联系吗?
    • ear 有两个模块:war 模块有 Rest 服务,ejb 模块有 bean?
    • 你好@Ilya没有任何解决方案可以调用包含restfull Web服务的ejb模块吗?我没有部署在服务器上的只有 ejb.jar 的战争文件。我想把这个 ejb 模块作为 rest api。如果你没有得到我的问题,请发表评论。谢谢
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多