2

我有一个在应用程序服务器(Websphere Application Server 7.0)上运行的 Web 服务(JAX-RPC)。通常开发过程是这样的:

  • 我编写了一个带有 Web 服务实现的类(例如 MyService.java)
  • IDE 生成 Web 服务端点接口(例如 MyService_SEI.java)
  • IDE 生成配置 XML

部署 Web 服务时,MyService_SEI 是声明的服务接口,应用程序服务器通过公共无参数构造函数实例化 MyService 实例。

但是如果我想进行构造函数注入(即有没有无参数构造函数的 MyService 类)或者如果我想提供一个实现 MyService_SEI 并使用它的动态代理对象怎么办?

有没有办法控制实例化过程(如过滤器或拦截器)来实现这一点?

4

2 回答 2

2

您不能进行构造函数注入,因为注入总是在调用默认构造函数之后发生。如果您尝试在默认构造函数中使用注入的引用,它总是会失败,没有解决方法,因为这是规范的要求。因此,您提到的第一个选项被丢弃。

对于第二个选项,使用过滤器或拦截器,您实际上有一个选项。WebSphere WebServices 是使用 Axis2 实现构建的,Axis 提供了一种实现 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>

于 2013-04-05T13:48:21.400 回答
1

一个简单的方法是创建两个类。一个你的班级有所有的花里胡哨(构造函数注入等让我们称之为工人)。和实际的服务。该服务将把它需要的东西委托给工人类,它可以通过调用一些工厂方法来获得。

工厂甚至可以查看一些常见的 db 或其他配置来决定哪个运行时实例(哪个类、什么配置、共享或公共),这样您就有了很好的分离和权力

仅仅因为您使用一种框架/注入方法并不意味着您不能混合以使其更强大

于 2013-04-11T22:42:38.117 回答