2015-10-30 3 views
2

У меня есть веб-сервиса, что я пытаюсь вызвать следующую стороне клиента код:Client 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), то вебсервис реализован в следующем:

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-address, может ли кто-нибудь помочь мне выяснить, что не так или нет в моем коде? Спасибо.

ответ

4

В коде на стороне клиента, я заменил следующее:

CxfAdd client = service.getCxfAddPort(); 

С следующим:

CxfAdd client = service.getCxfAddPort(
         new org.apache.cxf.ws.addressing.WSAddressingFeature()); 

И он работает сейчас.

Решение было предоставлено кем-то еще здесь:

http://www.coderanch.com/t/657413/Web-Services/java/CXF-Client-WS-Addressing-attributes

+0

Я искал так много для этого, большое спасибо! –

Смежные вопросы