簡體   English   中英

CXF客戶端和WS-Addressing屬性

[英]CXF Client and WS-Addressing attributes

我有一個要嘗試使用以下客戶端代碼調用的Web服務:

    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屬性,有人可以幫助我弄清楚代碼中有什么錯誤或缺失嗎? 謝謝。

在客戶端代碼中,我替換了以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM