如何使用@WebServiceRef从Web模块注入EJB [英] How to inject EJB with @WebServiceRef from Web-module

查看:139
本文介绍了如何使用@WebServiceRef从Web模块注入EJB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个JEE6应用程序,一个ejb和一个Web模块,运行在GlassFish 3.1.1
现在我想通过注入它(作为会话Bean)来访问WebService(JAX-WS)成为几个Managed Bean。

  @Stateless 
public class AnyService实现AnyServiceLocal {

@ WebServiceRef(wsdlLocation =META-INF / wsdl / AnyService / Any.wsdl)
private AnyService服务;
@Override
public String findLastname(Integer key){
任何port = service.getAnyPort();
AnyPerson sp = port.findAnynumber(key);
return sp.getLastname();
}

}

当我尝试访问它时:

  @ManagedBean 
@SessionScoped
public class UserBean {

@EJB
private AnyServiceLocal any;
public void findLastname(){
name = any.findLastname(Integer.valueOf(key));
}
}

我会得到这些例外

  WARNUNG:在EJB AnyService方法调用期间发生系统异常public java.lang.String de.mizui.anytest.ejb.bean.AnyService。 findLastname(java.lang.Integer)
javax.ejb.EJBException
在com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193)
在com.sun.ejb .containers.BaseContainer.completeNewTx(BaseContainer.java:5091)
在com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4879)
在com.sun.ejb.containers.BaseContainer .postInvoke(BaseContainer.java:2039)
在com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990)
在com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler .java:213)
在com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate。 java:79)
at $ Proxy430.findLastname(未知源)
..blabla ..
导致:javax.xml.ws.soap.SOAPFaultException:java.lang.NullPointerException
at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
在com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:134)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:123)
在com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java: 93)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
at $ Proxy431.findEmployeenumber(Unknown Source)
at de.mizui .anytest.ejb.bean.AnyService.findLastname(AnyService.java:25)
..blabla ..
导致:javax.xml.ws.WebServiceException:java.lang.NullPointerException
在com.sun.enterprise.security.jmac.provider.config.PipeHelper.makeFaultResponse(PipeHelper.java:321)
.. blabla ..
导致:java.lang.NullPointerException
在com.sun.xml.ws.tx.coordinator.CoordinationManager.lookupOrCreateCoordinator(CoordinationManager.java:175)
(稍微缩短。 。)

但是当我直接从UserBean中访问WS时,它的工作原理是
期待您的想法:)



* yay我的第一篇文章^^

解决方案

我有解决方案!
与Web服务的事务必须是原子的,如依赖注入。但是它尝试将请求嵌套到注入交易(hihi这个韵律)中,所以它不再是原子了。
您可以绕过具体方法的注释:

  @Stateless 
@LocalBean
public class AnyServices {

@WebServiceRef(wsdlLocation =META-INF / wsdl / AnyService / Any.wsdl)
private AnyService服务;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public String findLastname(Integer key){
任何port = service.getAnyPort();
AnyPerson sp = port.findAnynumber(key);
return sp.getLastname();
}

}

< 3


I have a JEE6 application, with an ejb and a web-module, running on a GlassFish 3.1.1 Now I wanted to access a WebService (JAX-WS) by injecting it (as a Session Bean) into several Managed Beans.

@Stateless
public class AnyService implements AnyServiceLocal {

    @WebServiceRef(wsdlLocation = "META-INF/wsdl/AnyService/Any.wsdl")
    private AnyService service;
    @Override
    public String findLastname(Integer key) {
        Any port = service.getAnyPort();
        AnyPerson sp = port.findAnynumber(key);
        return sp.getLastname();
    }

}

When I try to access it:

@ManagedBean
@SessionScoped
public class UserBean {

    @EJB
    private AnyServiceLocal any;
    public void findLastname() {
        name = any.findLastname(Integer.valueOf(key));
    }
} 

I'll get these Exceptions

WARNUNG: A system exception occurred during an invocation on EJB AnyService method public java.lang.String de.mizui.anytest.ejb.bean.AnyService.findLastname(java.lang.Integer)
javax.ejb.EJBException
        at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193)
        at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5091)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4879)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:213)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
        at $Proxy430.findLastname(Unknown Source)
        ..blabla..
Caused by: javax.xml.ws.soap.SOAPFaultException: java.lang.NullPointerException
        at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
        at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:134)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:123)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
        at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
        at $Proxy431.findEmployeenumber(Unknown Source)
        at de.mizui.anytest.ejb.bean.AnyService.findLastname(AnyService.java:25)
        ..blabla..
Caused by: javax.xml.ws.WebServiceException: java.lang.NullPointerException
        at com.sun.enterprise.security.jmac.provider.config.PipeHelper.makeFaultResponse(PipeHelper.java:321)
..blabla..
Caused by: java.lang.NullPointerException
        at com.sun.xml.ws.tx.coordinator.CoordinationManager.lookupOrCreateCoordinator(CoordinationManager.java:175)
    (somewhat shortened..)

But when I access the WS directly from within the UserBean, it works.. Looking forward to your ideas :)

*yay my first post^^

解决方案

I've got the solution! Transactions with Webservices have to be atomic, like dependency injection. But it tries to nest the request into the injection-transaction (hihi this rhymes), so it's not atomic anymore. You can bypass that for the specific method, with an annotation:

@Stateless
@LocalBean
public class AnyServices{

    @WebServiceRef(wsdlLocation = "META-INF/wsdl/AnyService/Any.wsdl")
    private AnyService service;

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public String findLastname(Integer key) {
        Any port = service.getAnyPort();
        AnyPerson sp = port.findAnynumber(key);
        return sp.getLastname();
    }

}

<3

这篇关于如何使用@WebServiceRef从Web模块注入EJB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆