Writing a Java Soap client, no spring, with policies

Viewed 25

For connecting to a webservice exposed via Soap I have to write a soap client in Java. So far so good by using the jax-ws wsimport that generates the java classes via a wsdl file.

The access point is a https endpoint with a username and password, when i create a request in soapUI with just this name and password as basic authentication this works fine, although this works not in my Java Client. I have also seen that the wsdl contains policies.

example how i call the webservice

  SoapService soapService =  new SoapService();
  SoapRequest soapRequest = soapService.getSoapRequest();
  BindingProvider bindingProvider = (BindingProvider) soapRequest ;
  Map<String, Object> requestContext = bindingProvider.getRequestContext();
  // adding the url to send to, differs from the one in the wsdl
  requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, connectionUrl);
   
  RequestResponse requestResponse = soapRequest.doRequest(request);

the policy in the wsdl

<wsp:Policy wsu:Id="BN__SOAPREQUEST">
    <wsp:ExactlyOne>
      <wsp:All>
        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">false</sapattahnd:Enabled>
        <saptrnbnd:OptimizedMimeSerialization wsp:Optional="true" xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"/>
        <wsaw:UsingAddressing wsp:Optional="true" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"/>
        <wsp:All>
          <sp:TransportBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
            <wsp:Policy>
              <sp:TransportToken>
                <wsp:Policy>
                  <sp:HttpsToken>
                    <wsp:Policy>
                      <sp:HttpBasicAuthentication/>
                    </wsp:Policy>
                  </sp:HttpsToken>
                </wsp:Policy>
              </sp:TransportToken>
              <sp:AlgorithmSuite>
                <wsp:Policy>
                  <sp:Basic128Rsa15/>
                </wsp:Policy>
              </sp:AlgorithmSuite>
              <sp:Layout>
                <wsp:Policy>
                  <sp:Strict/>
                </wsp:Policy>
              </sp:Layout>
            </wsp:Policy>
          </sp:TransportBinding>
        </wsp:All>
      </wsp:All>
      <wsp:All>
        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">false</sapattahnd:Enabled>
        <saptrnbnd:OptimizedXMLTransfer uri="http://xml.sap.com/2006/11/esi/esp/binxml" wsp:Optional="true" xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbinding/"/>
        <wsaw:UsingAddressing wsp:Optional="true" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"/>
        <wsp:All>
          <sp:TransportBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
            <wsp:Policy>
              <sp:TransportToken>
                <wsp:Policy>
                  <sp:HttpsToken>
                    <wsp:Policy>
                      <sp:HttpBasicAuthentication/>
                    </wsp:Policy>
                  </sp:HttpsToken>
                </wsp:Policy>
              </sp:TransportToken>
              <sp:AlgorithmSuite>
                <wsp:Policy>
                  <sp:Basic128Rsa15/>
                </wsp:Policy>
              </sp:AlgorithmSuite>
              <sp:Layout>
                <wsp:Policy>
                  <sp:Strict/>
                </wsp:Policy>
              </sp:Layout>
            </wsp:Policy>
          </sp:TransportBinding>
        </wsp:All>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>

I tried something like this but it doesn't work

 requestContext.put(BindingProvider.USERNAME_PROPERTY, userName);
 requestContext.put(BindingProvider.PASSWORD_PROPERTY, passWord);

I got the error :

None of the policy alternatives can be satisfied.

So my guess i have to provide stuff that fullfills the policy that is needed in the wsdl to the requestContext or can someone provide a good link how to do this. I have already searched a lot, tried with CXF but this is more focused on using with spring and as we are not using spring this doesn't work in this case.

0 Answers
Related