System property "javax.xml.soap.MessageFactory" for two different soap versions

shaiksha picture shaiksha · Jan 25, 2017 · Viewed 7.9k times · Source

i need to communicate with two webservices from my application. For one webservice i need to use soap1_1 version and for the other soap version is soap1_2. In this case what should be the value set for the system property "javax.xml.soap.MessageFactory"

Client 1:

public class SoapClient1 {


protected static Logger _logger = Logger.getLogger ("TEST");
private static Long retryDelay = null;


public String sendSoapMessage (String xml) throws Exception {

    SOAPMessage resp  = null;
    String response = null;
    String endpoint = "http:xxxx";



    System.setProperty("javax.xml.soap.MessageFactory","com.sun.xml.internal.messaging.saaj.soap.ver1_2.SOAPMessageFactory1_2Impl");
    SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
    SOAPConnection soapConnection = connectionFactory.createConnection();

    long start = System.currentTimeMillis();
    long end = System.currentTimeMillis();

    //URL endPoint = new URL(endpoint);

    //setting connection time out and read timeout

    URL endPoint = new URL (null, endpoint, new URLStreamHandler () {
        @Override
        protected URLConnection openConnection (URL url) throws IOException {

            URL clone = new URL (url.toString ());
            URLConnection connection = clone.openConnection ();
            connection.setConnectTimeout (60000);
            connection.setReadTimeout (60000);
            // Custom header

            return connection;
        }});


    try{

        start = System.currentTimeMillis();


            resp = soapConnection.call(getSoapRequest(xml), endPoint);      

        end = System.currentTimeMillis();

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        resp.writeTo(os);
        response = os.toString();


        if (!resp.getSOAPBody().hasFault()) {

            response = "SucCess:" + response;

            }else{

                response = "FaiLure:" + response;
            }

        }else{

            response = "FaiLure:" + response;
        }


    }catch(SOAPException se){
        _logger.log(Level.ERROR," Service Provisioning Call Failed");
        _logger.log(Level.ERROR,"The call duration before SOAPException =" +(end-start)+" ms.");

        se.printStackTrace();
        throw se;
    }

    soapConnection.close();
    return response;
}


private SOAPMessage getSoapRequest(String xml) throws SOAPException,Exception{

    MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    /* Create a SOAP message object. */
    SOAPMessage soapMessage = mf.createMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    SOAPBody soapBody = soapEnvelope.getBody();
    soapEnvelope.getHeader().detachNode();
    soapEnvelope.addNamespaceDeclaration("soap","http://yyyy");
    SOAPHeader header = soapEnvelope.addHeader();



    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    builderFactory.setNamespaceAware(true);

    InputStream stream  = new ByteArrayInputStream(xml.getBytes());
    Document doc = builderFactory.newDocumentBuilder().parse(stream);

    _logger.log(Level.DEBUG, "Adding SOAP Request Body");
    soapBody.addDocument(doc);

    soapMessage.saveChanges();

    return soapMessage;

}
}

sample request

<?xml version="1.0" encoding="UTF-8"?>
       <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soap="http://bridgewatersystems.com/xpc/tsc/entity/soap">
      <env:Header/>
        <env:Body>
             <TempTierChangeRequest xmlns="http://bridgewatersystems.com/xpc/tsc/entity/soap" credentials="root" principal="root">
           <temp-tier-change xmlns="">
                <service-components>
                     <service-component name="DSL_Tier_2"/>
                </service-components>
                <duration-sec>300</duration-sec>
                <description>1024 SC</description>
                <activation-date>2017-02-09T10:29:16</activation-date>
                <subscriber-id>[email protected]</subscriber-id>
                <partition-key>26752018010</partition-key>
                <ttc-id>3706043</ttc-id>
                <validity-period>
                     <duration>30</duration>
                     <expires-with-billing-reset>1</expires-with-billing-reset>
                </validity-period>
           </temp-tier-change>
      </TempTierChangeRequest>
      </env:Body>
      </env:Envelope>

Answer

pedrofb picture pedrofb · Feb 4, 2017

It is not possible to set the value of System variable javax.xml.soap.MessageFactory for two different purposes. The default value is set for SOAP 1.1

Remove the system property javax.xml.soap.MessageFactory and depending on the type of client you are building use

Building the soap message with MessageFactory.newInstance()

If you want SOAP1.1, use the default constructor

 MessageFactory factory = MessageFactory.newInstance();

If you want SOAP1.2, use

MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

See Java Tutorial.

JAX-WS clients configured with annotations @BindingType

@BindingType is used when the JAX-WS client is configured using annotations, for example if client is generated from WSDL. The annotation is added to Port to set the binding to SoapBinding.SOAP11HTTP_BINDING or SoapBinding.SOAP12HTTP_BINDING.

@WebService(targetNamespace = "https://myservice.services.com", name = "myserviceProxyProt")
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface MyServiceProxyPort {