简体   繁体   中英

Apache cxf + soap anonymous addressing

I am new to Soap addressing and I have to use wsa addressing with Apache cxf + camel.

This is the service endpoint created by apache cxf from wsdl

@WebMethod(operationName = "Inventory_SubmitResult", action = "http://htng.org/PWSWG/2010/12/Inventory_SubmitResult")
@Action(input = "http://htng.org/PWSWG/2010/12/Inventory_SubmitResult", output = "http://htng.org/PWSWG/2010/12/Inventory_SubmitResultResponse")
public void inventorySubmitResult(
    @WebParam(partName = "OTA_HotelInvCountNotifRS", mode = WebParam.Mode.INOUT, name = "OTA_HotelInvCountNotifRS", targetNamespace = "http://www.opentravel.org/OTA/2003/05")
    javax.xml.ws.Holder<OTAHotelInvCountNotifRS> otaHotelInvCountNotifRS
);

Having issues serving request, In soap request this is the namespace value for wsa in soap2:Header

xmlns:wsa="http://www.w3.org/2005/08/addressing" 

Problem I am facing is when ReplyTo header in incoming request has below value

 <wsa:ReplyTo>
            <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
 </wsa:ReplyTo>

then cxf interceptors is trying to call back the above address and failing with '405 Method not allowed' and my functionality does not work.

Error stack trace in the logs

2018-10-30 22:13:35,720  WARN org.apache.cxf.phase.PhaseInterceptorChain:475 - 5bd939df4b105100018a9fcc@:int - [Path:/integration-service/synxis/tenants/101/properties/103] -[Tenant Id: 101] -[Property Id: 103] - Interceptor for {http://synxis.com/Ota2010a/}IOta2010AService#{http://synxis.com/Ota2010a/}Inventory_SubmitResult has thrown exception, unwinding noworg.apache.cxf.interceptor.Fault: Could not send Message.\n        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67) ~[cxf-core-3.2.5.jar:3.2.5]\n  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.2.5.jar:3.2.5]\n       at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:90) [cxf-core-3.2.5.jar:3.2.5]\n     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.2.5.jar:3.2.5]\n       at org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:278) [cxf-core-3.2.5.jar:3.2.5]\n       at org.apache.cxf.ws.addressing.impl.InternalContextUtils$1.run(InternalContextUtils.java:319) [cxf-rt-ws-addr-3.2.5.jar:3.2.5]\n    at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:421) [cxf-core-3.2.5.jar:3.2.5]\n  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_112]\n        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_112]\n  at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:346) [cxf-core-3.2.5.jar:3.2.5]\n      at java.lang.Thread.run(Unknown Source) [na:1.8.0_112]\nCaused by: org.apache.cxf.transport.http.HTTPException: HTTP response '405: Method Not Allowed' when communicating with http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous\n    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.doProcessResponseCode(HTTPConduit.java:1620) ~[cxf-rt-transports-http-3.2.5.jar:3.2.5]\n       at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627) ~[cxf-rt-transports-http-3.2.5.jar:3.2.5]\n   at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1572) ~[cxf-rt-transports-http-3.2.5.jar:3.2.5]\n   at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1373) ~[cxf-rt-transports-http-3.2.5.jar:3.2.5]\n       at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56) ~[cxf-core-3.2.5.jar:3.2.5]\n    at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:225) ~[cxf-core-3.2.5.jar:3.2.5]\n        at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56) ~[cxf-core-3.2.5.jar:3.2.5]\n    at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:225) ~[cxf-core-3.2.5.jar:3.2.5]\n        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-core-3.2.5.jar:3.2.5]\n     at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:673) ~[cxf-rt-transports-http-3.2.5.jar:3.2.5]\n    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63) ~[cxf-core-3.2.5.jar:3.2.5]\n  ... 10 common frames omitted\n

I tried below things

  1. Changing the namespace value for wsa in soap2:Header like below and its working.

     xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
    1. Changing the reply to address value like below and it's working.

http://www.w3.org/2005/08/addressing/anonymous

  1. Removing the ReplyTo header is working

But I cannot do all this as request comes from third party.

I tried editing(removing the replyto header/updating the address node value in reply to header) soap headers in the request by putting a interceptor in PRE_LOGICAL phase but it did not work

   public class WsaHeaderInterceptor extends AbstractSoapInterceptor {

    public WsaHeaderInterceptor(String replyToUrlTemplate, MessageType messageType) {
        super(Phase.PRE_LOGICAL);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        //hard-coded for debugging
        Header header = message.getHeaders().remove(1);

                ((Element) (header.getObject())).getFirstChild().getNextSibling().getFirstChild()
                      .setNodeValue("" + "http://www.w3.org/2005/08/addressing/anonymous");

                ((Element) (header.getObject())).getFirstChild().getNextSibling().getFirstChild()
                     .setTextContent("" + "http://www.w3.org/2005/08/addressing/anonymous");

    }
}

Spent days on this and could not able to fix, any clues or pointers will really help.

WSDL file

    <?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://synxis.com/Ota2010a/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="OTA2010A" targetNamespace="http://synxis.com/Ota2010a/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsp:Policy wsu:Id="ota2010AEndpoint_policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <wsaw:UsingAddressing />
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  <wsdl:types>
    <xs:schema xmlns:tns="http://www.opentravel.org/OTA/2003/05" elementFormDefault="qualified" targetNamespace="http://www.opentravel.org/OTA/2003/05" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!--removed types -->
  </wsdl:types>

  <wsdl:message name="InvCountDeliveryResponse">
    <wsdl:part xmlns:q1="http://www.opentravel.org/OTA/2003/05" name="OTA_HotelInvCountNotifRS"
            element="q1:OTA_HotelInvCountNotifRS" />
  </wsdl:message>
  <wsdl:message name="InvCountDeliveryResponse_Headers">
    <wsdl:part xmlns:q2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" name="Security" element="q2:Security" />
    <wsdl:part xmlns:q3="http://htng.org/1.3/Header/" name="TimeStamp" element="q3:TimeStamp" />
    <wsdl:part xmlns:q4="http://htng.org/PWSWG/2007/02/AsyncHeaders" name="CorrelationID" element="q4:CorrelationID" />
    <wsdl:part xmlns:q5="http://htng.org/PWSWG/2007/02/AsyncHeaders" name="RelatesToCorrelationID" element="q5:RelatesToCorrelationID" />
    <wsdl:part xmlns:q6="http://htng.org/PWSWG/2007/02/AsyncHeaders" name="ReplyTo" element="q6:ReplyTo" />
  </wsdl:message>

  <wsdl:message name="InventoryCountResponse">
    <wsdl:part xmlns:q7="http://www.opentravel.org/OTA/2003/05" name="OTA_HotelInvCountNotifRS" element="q7:OTA_HotelInvCountNotifRS" />
  </wsdl:message>
  <wsdl:message name="InventoryCountResponse_Headers">
    <wsdl:part xmlns:q8="http://htng.org/1.3/Header/" name="TimeStamp" element="q8:TimeStamp" />
  </wsdl:message>

  <wsdl:portType name="IOta2010A">
    <!-- Adding Inbound for Async Response starts here -->
    <wsdl:operation name="Inventory_SubmitResult">
      <wsdl:input wsaw:Action="http://htng.org/PWSWG/2010/12/Inventory_SubmitResult" name="InvCountDeliveryResponse" message="tns:InvCountDeliveryResponse" />
      <wsdl:output wsaw:Action="http://htng.org/PWSWG/2010/12/Inventory_SubmitResultResponse" name="InventoryCountResponse" message="tns:InventoryCountResponse" />
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="ota2010AEndpoint" type="tns:IOta2010A">
    <wsp:PolicyReference URI="#ota2010AEndpoint_policy" />
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Inventory_SubmitResult" >
      <soap12:operation soapAction="http://htng.org/PWSWG/2010/12/Inventory_SubmitResult" style="document" />
      <wsdl:input name="InvCountDeliveryResponse">
        <soap12:header message="tns:InvCountDeliveryResponse_Headers" part="Security" use="literal" />
        <soap12:header message="tns:InvCountDeliveryResponse_Headers" part="TimeStamp" use="literal" />
        <soap12:header message="tns:InvCountDeliveryResponse_Headers" part="RelatesToCorrelationID" use="literal" />
        <soap12:header message="tns:InvCountDeliveryResponse_Headers" part="ReplyTo" use="literal" />
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output name="InventoryCountResponse">
        <soap12:header message="tns:InventoryCountResponse_Headers" part="TimeStamp" use="literal" />
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="OTA2010A">
      <wsdl:port name="ota2010AEndpoint" binding="tns:ota2010AEndpoint">
         <soap12:address location="https://integcert.synxis.com/Interface/ota2010av2/OTA2010A.svc"/>
         <wsa10:EndpointReference>
            <wsa10:Address>https://integcert.synxis.com/Interface/ota2010av2/OTA2010A.svc</wsa10:Address>
         </wsa10:EndpointReference>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

Doesn't really answer the question but hopefully this info can be useful:

So the requestor uses the http://www.w3.org/2005/08/addressing namespace but then specifies the http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous URI?

schemas.xmlsoap.org namespaces are used for SOAP 1.1. while www.w3.org" namespaces are used for SOAP 1.2.

However the SOAP 1.2 spec says that SOAP 1.2 should be backwards compatible.

WS-Addressing is conformant to the SOAP 1.2 Messaging Framework processing model and is also compatible with SOAP 1.1 for backwards compatibility.

Here is the spec on SOAP 1.2 anonymous addressing

It does look like the http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous URI is recognized in CXF via the org.apache.cxf.ws.addressing.VersionTransformer class.

It seems like the addressing in the request should be valid and should be understood by CXF.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM