6

我的 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

我的一个 SOAPHandlers 试图调用 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吗?恕我直言,我看起来更好。:)

4

3 回答 3

5

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

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

使用@EJB,没有错。

于 2013-03-16T06:01:56.057 回答
1

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

@Named

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

....

@Inject

private MyEJB myEJB; 

...

}
于 2016-04-06T06:41:59.257 回答
0

如果有人像我一样在这里谷歌,可以在 TomEE 中这样做:http: //svn.apache.org/repos/asf/tomee/tomee/trunk/server/openejb-cxf/src/test/java/ org/apache/openejb/server/cxf/handler/SimpleHandler.java

于 2014-09-15T11:46:15.123 回答