我有一个在应用程序服务器 (Websphere Application Server 7.0) 上运行的 Web 服务 (JAX-RPC)。 通常开发流程是这样的:
- 我编写了一个带有 Web 服务实现的类(例如 MyService.java)
- IDE 生成 Web 服务端点接口(interface)(例如 MyService_SEI.java)
- IDE 生成配置 XML
部署Web服务时,MyService_SEI是声明的服务接口(interface),应用服务器通过公共(public)无参数构造函数实例化MyService实例。
但是,如果我想进行构造函数注入(inject)(即具有没有无参数构造函数的 MyService 类),或者如果我想提供一个实现 MyService_SEI 的动态代理对象并使用它,该怎么办?
有没有办法可以控制实例化过程(如过滤器或拦截器)来实现此目的?
最佳答案
您无法进行构造函数注入(inject),因为注入(inject)总是在调用默认构造函数之后发生。如果您尝试在默认构造函数内使用注入(inject)的引用,它总是会失败,没有解决方法,因为这是规范强制要求的。 所以你提到的第一个选项被丢弃。
对于第二个选项,使用过滤器或拦截器,您实际上有一个选择。 WebSphere WebServices 是使用 Axis2 实现构建的,Axis 提供了一种 implementing Handlers 的方法。
您可以将处理程序添加到 JAX-WS 运行时环境中,以对请求和响应消息执行其他处理。
这是来自 Axis 文档的处理程序示例:
package org.apache.samples.handlersample;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class SampleProtocolHandler implements
javax.xml.ws.handler.soap.SOAPHandler<SOAPMessageContext> {
public void close(MessageContext messagecontext) {
}
public Set<QName> getHeaders() {
return null;
}
public boolean handleFault(SOAPMessageContext messagecontext) {
return true;
}
public boolean handleMessage(SOAPMessageContext messagecontext) {
Boolean outbound = (Boolean) messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outbound) {
// Include your steps for the outbound flow.
}
return true;
}
}
然后添加一个 handler.xml 文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jws:handler-chain name="MyHandlerChain">
<jws:protocol-bindings>##SOAP11_HTTP ##ANOTHER_BINDING</jws:protocol-bindings>
<jws:port-name-pattern
xmlns:ns1="http://handlersample.samples.apache.org/">ns1:MySampl*</jws:port-name-pattern>
<jws:service-name-pattern
xmlns:ns1="http://handlersample.samples.apache.org/">ns1:*</jws:service-name-pattern>
<jws:handler>
<jws:handler-class>org.apache.samples.handlersample.SampleLogicalHandler</jws:handler-class>
</jws:handler>
<jws:handler>
<jws:handler-class>org.apache.samples.handlersample.SampleProtocolHandler2</jws:handler-class>
</jws:handler>
<jws:handler>
<jws:handler-class>org.apache.samples.handlersample.SampleLogicalHandler</jws:handler-class>
</jws:handler>
<jws:handler>
<jws:handler-class>org.apache.samples.handlersample.SampleProtocolHandler2</jws:handler-class>
</jws:handler>
</jws:handler-chain>
关于java - 如何提供自己的Web服务实现实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677240/