从MDB和Jax-WS中的抽象基类调用@EJB

时间:2014-01-21 05:30:27

标签: java web-services java-ee ejb jax-ws

我有以下类的设置。我试图通过两个协议进行相同的操作 - 基于Web服务和基于JMS

在EJB模块中我有

public abstract class AbstractMsgListener {

    @EJB(name = "classLoadUtil")
    private ClassLoadUtil classLoadUtil;

    protected void doSomething()
        classLoadUtil.doSomething();
    }

}

有一个MDB

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/myqueue") })
public class MDB_JMSHandler extends AbstractMsgListener implements MessageListener {

    public void onMessage(Message inMessage) {
        TextMessage textMessage = getTextMessage(inMessage);
        doSomething();
    }

}

我有一个基于JAX-WS实现的Web服务,如下面给出的那样

@WebService(name = "...", targetNamespace = "...")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({ com.message.beans.ObjectFactory.class })
public class WebServiceImpl extends AbstractMsgListener implements com.message.beans.WebServicesPortType {

    @Override
    @WebMethod(operationName = "...", action = "...")
    @WebResult(name = "...", targetNamespace = "...", partName = "...")
    public WSDataResponse syncWSData(@WebParam(name = "...", targetNamespace = "...", partName = "...") WSDataRequest wsDataRequest) {
        doSomething();

        WSDataResponse response = new WSDataResponse();
        Acknowledgement ack = new Acknowledgement();
        ack.setMessage("Success");
        ack.setReturnCd("0");
        response.setAcknowledgement(ack);
        return response;
    }

}

Abstract类位于单独的EJB模块中。 MDB和Web服务实现存在于单独的Web应用程序项目中。在执行期间,MDB按预期工作。但Web服务抛出NullPointerException。原因是以下代码无法正常用于Webservice

    @EJB(name = "classLoadUtil")
    private ClassLoadUtil classLoadUtil;

没有为classLoadUtil分配任何对象。但同样适用于MDB。 我想我在这里错过了一些东西。

1 个答案:

答案 0 :(得分:0)

我建议使用默认实现,看看它是否有效。

@WebService(name = "...", targetNamespace = "...")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({ com.message.beans.ObjectFactory.class })
public class WebServiceImpl extends AbstractMsgListener implements com.message.beans.WebServicesPortType {

@EJB(name = "classLoadUtil")
private ClassLoadUtil classLoadUtil;

然后在 syncWSData 方法中使用EJB classLoadUtil ,看看它是否有效。

如果确实有效,那么您可以尝试继承版本。

如果它不起作用,那么我认为这是WS类的 webproject 中的类路径问题