2015-08-27 83 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); 
相關問題