【问题标题】:Inject EJB into Servlet将 EJB 注入 Servlet
【发布时间】:2014-04-25 10:13:59
【问题描述】:

有谁知道为什么将 EJB 注入 Servlet 如此困难?我正在使用 JBoss 6.2。无论我尝试什么,我的处理程序变量都是 null。

@Local
public interface RequestHandlerInterface {
    public String handleRequest(String authKey);    
}

@Singleton
public class RequestHandler implements RequestHandlerInterface {
...
}

public class Test extends HttpServlet {
    @EJB
    private RequestHandlerInterface handler;  //Always null
}

在应用程序上下文中:

<bean id="requestHandler" class="company.application.RequestHandler" />

在 web.xml (v3.0) 中:

<servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>company.test.Test</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/Test</url-pattern>
</servlet-mapping>

  <ejb-local-ref>
    <ejb-ref-name>RequestHandler</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>company.application.RequestHandlerInterface</local>
  </ejb-local-ref>

我已经尝试了很多组合,每个 @EJB(...) 选项...有什么想法吗?
注意:所有内容都包含在单个 WAR 中。
注意:我尝试过私有 RequestHandler 处理程序;而不是界面。
注意:我已尝试使用 (name="ejb/RequestHandler") 和 mappedName、beanName、lookup
注意:我尝试过使用@Remote 和@Local,使用ejb-local-ref 和ejb-ref

注意:
部署单元部署“company.war”中名为 RequestHandler 的会话 bean 的 JNDI 绑定如下:

java:global/company/RequestHandler!company.application.RequestHandlerInterface
java:app/company/RequestHandler!company.application.RequestHandlerInterface
java:module/RequestHandler!company.application.RequestHandlerInterface
java:global/company/RequestHandler
java:app/company/RequestHandler
java:module/RequestHandler

【问题讨论】:

标签: java servlets jboss dependency-injection ejb


【解决方案1】:

我在这里找到了答案:How to connect HttpServlet with Spring Application Context in web.xml?

也许 Jay 的答案适用于仅 EJB 的配置。但是我的应用程序是 Spring 配置的,所以我猜这一定是一些问题,Spring 控制并禁止注入,除非它知道它。

【讨论】:

  • 好吧,如果您使用的是 Spring,您可能应该使用 Spring 注释来进行注入,而不是 JEE @EJB 注释。
【解决方案2】:

如下所示使用本地而不是家庭

<ejb-ref>
   <ejb-ref-name>ejb/RequestHandler</ejb-ref-name>
   <ejb-ref-type>Session</ejb-ref-type>
   <local>company.application.RequestHandlerInterface</local>
</ejb-ref>

【讨论】:

  • (注意,为了简化我的示例,我去掉了“ejb/”)
  • 尝试删除所有 内容并再次检查。
  • 没有变化。 “注入”RequestHandler 仍然为空。
  • 它在 JBoss EAP 6.1 上对我来说工作得非常好,但我尝试使用 Stateless 而不是 Singleton EJB。我什至没有定义任何
  • 嗯,这可能是一个范围问题,因为 Servlet 是会话范围的,而单例是应用程序范围的。我最终在我的 Servlet 和 EJB 之间设置了一个队列,这非常荒谬。但它至少有效。我要离开一个星期,但我回来时会测试。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多