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

标签 java web-services websphere

我有一个在应用程序服务器 (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/

相关文章:

java - 如何从Websphere的标准输出日志中找出Web服务器模块使用了哪个端口?

java - Android 中的 Volley API 有什么用?

.net - 从脚本或批处理文件调用 Web 服务

java - 在 B 继承自 A 的情况下创建了多少个对象?

web-services - RESTful API 响应状态码消歧

c# - WCF 无法将文件作为流返回

spring - 找不到文件 Spring 项目的问题

java - 访问 Azure 端点时遇到 "java.net.ConnectException: A route to the remote host is not available"

java - Java Arrays.binarySearch 方法的 C 实现

Java Spring Framework jmx 托管注释@ManagedAttribute 未在 MBeanServerConnection/Jconsole/Visual vm/bean 列表中显示方法