我如何提供自己的Web服务实现实例?

时间:2013-03-28 08:33:20

标签: java web-services websphere

我有一个在应用服务器(Websphere Application Server 7.0)上运行的Web服务(JAX-RPC)。 通常,开发过程如下所示:

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

部署Web服务时,MyService_SEI是声明的服务接口,应用程序服务器通过public no-arg构造函数实例化MyService实例。

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

有没有办法控制实例化程序(如过滤器或拦截器)来实现这个目的?

2 个答案:

答案 0 :(得分:2)

您无法进行构造函数注入,因为在调用默认构造函数后,始终会发生注入。如果您尝试在默认构造函数中使用注入引用,它将始终失败,没有解决方法,因为这是规范的授权。 所以你提到的第一个选项被丢弃了。

对于第二个选项,使用过滤器或拦截器,实际上有一个选项。 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>

答案 1 :(得分:1)

一个简单的方法就是制作两个班级。一个你的班级所有的钟声和口哨(构造函数注入等让我们称之为工人)。和实际的服务。该服务会将它需要的内容委托给worker类,通过调用一些工厂方法可以获得它。

工厂甚至可以查看一些常见的数据库或其他配置来决定哪个运行时实例(哪个类,什么配置,共享或常用),以便您具有良好的分离和功能

只是因为你正在使用一种框架/注射方法并不意味着你不能混合使其更强大