java - 如何在 JAX-WS 客户端中实现 SOAP 处理程序

标签 java web-services soap wsdl

我正在尝试为客户端实现 SOAP 处理程序。我正在使用 Wildfly8.2 java8 和 JAX-WS 以及 Maven

我已经用 eclipse 从端点 WSDL 生成了客户端接口(interface)类

handler-chain.xml 文件与客户端接口(interface)放在同一个包中。

当我调用 Web 服务时,它执行正常,但未调用处理程序。如果我在处理程序中放置一个制动点,它永远不会被调用

客户端界面是这样的:

@WebService(targetNamespace = "********************", name = "WorkflowEditor")
@XmlSeeAlso({ ObjectFactory.class })
@HandlerChain(file = "handler-chain.xml")
public interface WorkflowEditor {

我也尝试过将 xml 放入资源中,并在注释中使用我验证有效的 url 调用它,例如:

    @WebService(targetNamespace = "**************", name = "WorkflowEditor")
@XmlSeeAlso({ ObjectFactory.class })
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@HandlerChain(file = "http://cloudflow-backend-local.arctur.net:8080/resources/handler-chain.xml")
public interface WorkflowEditor {

处理程序是这样的:

package si.arctur.services.handlers;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class PrintEnvelopeHandler implements javax.xml.ws.handler.soap.SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        System.out.println("Client : handleMessage()......");
        SOAPMessage soapMessage = context.getMessage();
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        System.out.println("Client : handleFault()......");
        return true;
    }

    @Override
    public void close(MessageContext context) {
        System.out.println("Client : close()......");
    }

    @Override
    public Set<QName> getHeaders() {
        // TODO Auto-generated method stub
        return null;
    }

}

handler-chain.xml 文件是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains 
 xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<javaee:handler-chain>
<javaee:handler>
  <javaee:handler-class>si.arctur.services.handlers.PrintEnvelopeHandler</javaee:handler-class>
</javaee:handler>
 </javaee:handler-chain>

最佳答案

(注意:此处其他答案指定的指南存在缺陷。它要求您编辑自动生成的文件。这永远不会结束。)

(目前)没有标准方法可以仅使用注释将处理程序链附加到 Web 服务客户端。要添加处理程序,您需要使用 JAX-WS API:

// 'sei' is assumed to be the service endpoint interface
BindingProvider bp = (BindingProvider) sei;

// Get the handler chain
List<Handler> handlerChain = bp.getBinding().getHandlerChain();

// Add your handler
handlerChain.add(myHandler);

// Re-set the handler chain (needed because getHandlerChain() returns
// a copy of the handlers' list.
bp.getBinding().setHandlerChain(handlerChain);

关于java - 如何在 JAX-WS 客户端中实现 SOAP 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255843/

相关文章:

java - 完全相同的代码(使用多线程)无法在两台不同的计算机上运行

java - 如何根据某些特定条件检索深度嵌套数组 spring mongodb

web-services - 返回图像和数字的 Web 服务

java - Web 服务自定义绑定(bind) - 签署 SOAP header 和消息,但不加密

c# - 在 C# 中使用 Amadeus Soap4.0

ruby-on-rails - 存储 Web 服务密码的最佳实践

java - WSDL 中名称相同但参数不同的两个操作

java - 1772 加勒比在线判断超时错误。请帮我找出为什么我的算法花了这么长时间

java - 用户注销时 ViewPager 事件给我错误

java - Android:由于 Web 服务 Http 请求, Activity 显示时间过长