如何将EJB注入SOAPHandler?

时间:2012-12-31 08:31:47

标签: ejb jax-ws cdi

我的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合作?我看起来更好。 :)

3 个答案:

答案 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)