实现无状态EJB 3.1以调用Web服务的正确方法是什么。我的客户端作为Servlet工作,但我想将调用移动到EEJ bean中。我必须在SOAP标头信封中添加用户名和密码才能访问WS,这样可以正常工作。
servlet使用的服务如下所示;
@WebServiceClient(name = "MessageService", targetNamespace = "http://...", wsdlLocation = "...wsdl")
public class MessageService
extends Service
我可以将MessageService
包装在无状态EJB中,还是bean本身应该使用@WebServiceRef
(如教程中所述)而不包装MessageService?
答案 0 :(得分:4)
如果客户端和提供程序位于应用程序服务器上的相同EAR或WAR中,则可以像序数 EJB一样调用它。 e.g。
@WebService
@Stateless
public class CalculatorBean implements Calculator {
public int add(int a, int b) {
return a + b;
}
}
CalculatorBean
是线程安全的。 add
方法中出现的所有业务逻辑
是容器管理事务的一部分,不参与任何全局事务。
或者,客户端代码可以在JNDI名称空间中查找。
运行时可以将服务对象或端口对象注入到使用javax.xml.ws.WebServiceRef
注释的成员变量中。
@WebServiceRef(CalculatorService.class)
private Calculator port;
CalculatorService
类使用javax.xml.ws.WebServiceClient
注释(服务的客户端)注释,该注释具有wsdlLocation
属性。
如果要将WebService包装到EJB中,请参阅此answer。有关此问题的阅读,请参阅EJB and Web Services: getting the best of both worlds。