2015-08-27 48 views
4

我正在试图为客户端实现SOAP处理程序。我使用如何在JAX-WS客户端中实现SOAP处理程序

我已经产生与蚀客户端接口类从终点WSDL

处理机-chain.xml文件被放置在同一个包中Wildfly8.2 java8和JAX-WS和Maven客户端界面。

当我调用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; 
    } 

} 

和处理器,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> 

回答

4

@HandlerChain注释可以被放置在如在this教程中描述的客户端类(@WebServiceClient注释)。

+0

教程,告诉你编辑生成的文件,是最有可能丢失的东西。 – Isaac

0

正如我可以理解,客户端界面和客户端位于2个不同的套餐。怀疑handler-chain.xml无法找到。

  • 最正确的解决办法是将处理器,chain.xml文件的Maven项目的文件夹放置在主/资源。

  • 或者,尝试在@HandlerChain注释的文件属性中给出文件位置的完整程序包路径。

+0

如果我将handler-chain.xml放入资源中,我想我仍然需要将注释放在界面上?有了正确的路径资源犯? – simonC

+0

是的,因为问题似乎是handler-chain.xml的位置,所以仍然需要注解。移动src/main/resources中的文件时,文件位于类路径中,并且它位于根文件夹中,因为它已在注释中声明。 – sanastasiadis

+0

看起来它没有帮助,我已经把处理程序链。XML到资源,我已经把@HandlerChain的URL与xml文件一样@HandlerChain(file =“http://cloudflow-backend-local.arctur.net:8080/resources/handler-chain.xml”) ...我已经验证了网址,它的工作原理,它返回的XML确定,但无论如何,处理程序不启动时,Web服务方法被调用...你有一个想法如何cha为什么处理程序不被调用? – simonC

1

注意:通过其他的答案这里指定的引导是有缺陷它要求你编辑自动生成的文件,这从来没有好结果。)

有(目前)没有标准的方式来连接仅使用注释的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); 
相关问题