我的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
我的一个试图调用EJB的SOAPHandler。
@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
合作?我看起来更好。 :)
答案 0 :(得分:5)
如果我没弄错的话,在Web服务调用之前调用SOAPHandler
。根据CDI规范(请参阅scopes and contexts),在Web服务上下文中,在Web服务调用期间,所有正常范围仅 处于活动状态。除了所有正常范围外,还有@Dependent
伪范围。除非另有说明,否则这是默认范围。它的生命周期取决于其中一个正常范围,因此本身不存在。
现在,无状态EJB因为它没有与CDI相关的注释,它自动@Dependent
并且无法在正常范围不活动的任何地方注入(使用@Inject
)。在您的情况下,在SOAPHandler
内部没有活动范围,因此您无法使用@Inject
。
使用@EJB
,没有错。
答案 1 :(得分:1)
如果使用CDI“@named”注释注释soap处理程序类,则可以注入任何EJB组件。通过这样做,您的soap处理程序类成为容器托管bean,并且您开始能够将其他容器托管bean用作EJB。
@Named
public class MyHandler implements SOAPHandler'<'SOAPMessageContext'>' {
....
@Inject
private MyEJB myEJB;
...
}
答案 2 :(得分:0)