我正在尝试为客户端实现SOAP Handler。我正在使用Wildfly8.2 java8和JAX-WS以及Maven
我已经从端点WSDL
生成了eclipse的客户端接口类handler-chain.xml文件与客户端接口放在同一个包中。
当我调用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>
答案 0 :(得分:4)
@HandlerChain
注释可以放在客户端类(使用@WebServiceClient
注释),如this教程中所述。
答案 1 :(得分:3)
(注意:此处其他答案指定的指南存在缺陷。它会要求您编辑自动生成的文件。这永远不会结束。)
目前没有使用注释将处理程序链附加到Web Service客户端的标准方法。要添加处理程序,您需要使用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);
答案 2 :(得分:0)
据我所知,客户端界面和客户端类位于2个不同的包中。怀疑无法找到 handler-chain.xml 。
最正确的解决方案是将 handler-chain.xml 文件放在maven项目的 main / resources 文件夹中。
或者,尝试在@HandlerChain
注释的文件属性上提供文件位置的完整包路径。