2015-10-30 106 views
2

我有我想通過以下客戶端代碼來調用web服務:CXF客戶端和WS-Addressing的屬性

import com.test.wsdl.CxfAdd; 
    import com.test.wsdl.CxfAddService; 

    import java.util.Map; 

    import javax.xml.ws.BindingProvider; 

    import org.apache.cxf.ws.addressing.AddressingProperties; 
    import org.apache.cxf.ws.addressing.AttributedURIType; 
    import org.apache.cxf.ws.addressing.EndpointReferenceType; 
    import org.apache.cxf.ws.addressing.JAXWSAConstants; 

    public class Main { 

     public static void main(String[] args) { 

      CxfAddService service = new CxfAddService(); 
      CxfAdd client = service.getCxfAddPort(); 

      Map<String, Object> requestContext = ((BindingProvider)client).getRequestContext(); 

      AddressingProperties maps = new AddressingProperties(); 
      EndpointReferenceType ref = new EndpointReferenceType(); 
      AttributedURIType add = new AttributedURIType(); 

      add.setValue("http://www.w3.org/2005/08/addressing/anonymous"); 
      ref.setAddress(add); 
      maps.setReplyTo(ref); 
      maps.setFaultTo(ref); 

      requestContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES, maps); 

      client.myMethodOneWay("Input message"); 
     } 
    } 

服務器端(Tomcat)的,在web服務被實現爲以下情況:

CxfAdd.java:

package com.test.ws; 

    import javax.jws.Oneway; 
    import javax.jws.WebResult; 
    import javax.jws.WebService; 
    import javax.xml.ws.soap.Addressing; 

    @WebService(targetNamespace = "http://test.com/wsdl") 
    @Addressing(enabled = true, required = true) 
    public interface CxfAdd { 

     @WebResult(name = "response") 
     public abstract String myMethod(String message); 

     @WebResult(name="response") 
     @Oneway 
     public void myMethodOneWay(String message); 
    } 

CxfAddImpl.java:

package com.test.ws; 

    import javax.annotation.Resource; 
    import javax.jws.Oneway; 
    import javax.jws.WebService; 
    import javax.xml.ws.WebServiceContext; 
    import javax.xml.ws.soap.Addressing; 

    @WebService 
    @Addressing 
    public class CxfAddImpl implements CxfAdd { 

     @Resource 
     WebServiceContext webServiceContext; 

     public String myMethod(String message) { 
      System.out.println("Invoking sayHello in " + getClass()); 
      return "Hello " + message; 
     } 

     @Oneway 
     public void myMethodOneWay(String message) { 
      // TODO Auto-generated method stub  
     } 
    } 

然而,當我運行客戶端代碼,在服務器端,我得到以下錯誤:

INFO: Inbound Message 
---------------------------- 
ID: 46 
Address: http://localhost:8080/CxfAddressingServer/services/cxfadd 
Encoding: UTF-8 
Http-Method: POST 
Content-Type: text/xml; charset=UTF-8 
Headers: {Accept=[*/*], cache-control=[no-cache], connection=[keep-alive], Content-Length=[211], content-type=[text/xml; charset=UTF-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[Apache CXF 3.1.3]} 
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:myMethodOneWay xmlns:ns2="http://test.com/wsdl"><arg0>Input message</arg0></ns2:myMethodOneWay></soap:Body></soap:Envelope> 
-------------------------------------- 
Out 30, 2015 7:18:56 PM org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs 
WARNING: WS-Addressing - failed to retrieve Message Addressing Properties from context 

看來,我不發送ws-addressing屬性,任何人都可以幫我弄清楚我的代碼中有什麼錯誤或缺失?謝謝。

回答