当前位置: 首页 > 知识库问答 >
问题:

CXF客户端和WS-Addressing属性

施兴言
2023-03-14

我有一个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),webservice实现如下:

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属性,有人能帮我找出代码中的错误或缺失吗?非常感谢。

共有1个答案

余弘新
2023-03-14

客户端代码中,我替换了以下内容:

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

 类似资料:
  • 我正在使用cxf作为带有WS-寻址的apache骆驼路由中的生产者。我知道可以通过(例如可能是错误的)在路由中设置SoapAction Header WS-Addressing操作字段是否也可以这样做?因为我注意到它发送的值错误。我需要输入两个WS-Addressing操作值,并在驼峰路线中决定使用哪一个。

  • 问题:CXF能否基于WS-SecurityPolicy文件自动为客户端配置WS-Security? 如果是的话,是否有任何关于实际这样做的文件?我花了几个小时查看CXF站点并进行搜索,但没有找到答案。 CXF留档显示“CXF 2.2引入了对使用WS-SecurityPolicy配置WSS4J的支持,而不是WS-Security页面上记录的自定义配置”,并且还显示“在CXF 2.2中,如果cxf-r

  • 问题内容: 所有,我都试图编写一个在Axis2.1.5中调用Web Service客户端的Junit测试,而对于如何准确地将其设置为使用WS- Addressing感到困惑。 我已经使用wsdl2java生成了一个客户端存根,并且正在使用axis2二进制发行版中的axis2.xml和模块存储库。 我知道我需要使用WS-Addressing的MemberSubmission版本,并且我 认为 我已经

  • 我有一个问题:我们正在尝试用Apache CXF实现WS-Addressing。我可以设置一些标题,如to或Action,但无法设置其他标题,如From、ReplyTo或FaultTo。 有人知道怎么做吗?

  • 是否可以将WS-Addressing与解耦的endpoint一起使用,但不使用Jetty,只使用ServletDestination? 我得到了以下异常,并且我的SOAP标头包含任何错误的回复To地址: 有效载荷: 有人有线索吗?

  • 我试图用Apache CXF 2.7.18实现WS-Addressing。我可以设置一些标题,如to、Action等。。但我想从SOAP请求中删除ReplyTo 有人知道怎么做吗?