【问题标题】:How to inject EJB into SOAPHandler?如何将 EJB 注入 SOAPHandler?
【发布时间】:2012-12-15 11:31:33
【问题描述】:

我的 JAX-WS 战争包含以下条目。

WEB-INF/lib/
WEB-INF/beans.xml // empty
WEB-INF/lib/commons-logging-1.1.1.jar
WEB-INF/lib/corrs-beans-1.0-alpha-1-SNAPSHOT.jar // EJBs are here
WEB-INF/lib/corrs-entities-1.0-alpha-1-SNAPSHOT.jar
WEB-INF/lib/joda-time-1.6.2.jar
WEB-INF/lib/opensaml-2.5.1-1.jar
WEB-INF/lib/openws-1.4.2-1.jar
WEB-INF/lib/slf4j-api-1.6.1.jar
WEB-INF/lib/wss4j-1.6.8.jar
WEB-INF/lib/xmlsec-1.5.3.jar
WEB-INF/lib/xmltooling-1.3.2-1.jar
WEB-INF/web.xml
META-INF/maven/
META-INF/maven/kr.co.ticomms.corrs/
META-INF/maven/kr.co.ticomms.corrs/corrs-services/
META-INF/maven/kr.co.ticomms.corrs/corrs-services/pom.xml
META-INF/maven/kr.co.ticomms.corrs/corrs-services/pom.properties

我的一个 SOAPHandler 试图调用 EJB。

@HandlerChain(file=...)
@WebService(...)
public class MyService {
}

public class MyHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(final SOAPMessageContext context) {
        // MyEJB null
    }

    @Inject
    private MyEJB myEJB; // << NULL
}

MyEJB 只是一个非界面视图 EJB。

@LocalBean
@Stateless
public class MyEJB {
}

谁能告诉我如何将 EJB 注入到 SOAPHandlers 中?

更新/(可能)回答

我将@Inject 更改为@EJB,它可以工作。

有什么方法可以使用@Inject?恕我直言,我看起来更好。 :)

【问题讨论】:

  • 如何将处理程序绑定到 Web 服务? 规范只提到了在处理程序生命周期中对@Resource注解注入的支持。

标签: ejb jax-ws cdi


【解决方案1】:

如果您使用 CDI "@named" 注释来注释您的肥皂处理程序类,您可以注入任何 EJB 组件。通过这样做,您的 soap 处理程序类变成了一个容器管理的 bean,并且您开始能够将其他容器管理的 bean 用作 EJB。

@Named

public class MyHandler implements SOAPHandler'<'SOAPMessageContext'>' {

....

@Inject

private MyEJB myEJB; 

...

}

【讨论】:

  • 使用 Glassfish/Payara 我至少在尝试注入普通 CDI Bean(非 EJB)时会收到 NullPointerException。
【解决方案2】:

【讨论】:

    【解决方案3】:

    如果我没记错的话,SOAPHandlers 在 Web 服务调用之前被调用。根据 CDI 规范(请参阅 scopes and contexts),在 Web 服务上下文中,所有正常范围在 Web 服务调用期间处于活动状态。除了所有普通作用域之外,还有@Dependent 伪作用域。除非另有说明,否则这是默认范围。它的生命周期取决于正常范围之一,因此不能单独存在。

    现在,一个无状态的 EJB,因为它没有与 CDI 相关的注释,它自动为 @Dependent 并且不能在正常范围不活动的任何地方注入(使用 @Inject)。在您的情况下,在 SOAPHandler 内没有活动范围,因此您不能使用 @Inject

    使用@EJB,没有错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2014-02-20
      • 1970-01-01
      • 2016-11-16
      • 2012-05-25
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多