web-dev-qa-db-ja.com

2つの異なるSOAPバージョンのシステムプロパティ「javax.xml.soap.MessageFactory」

アプリケーションから2つのWebサービスと通信する必要があります。 1つのWebサービスにはsoap1_1バージョンを使用する必要があり、もう1つのsoapバージョンにはsoap1_2を使用する必要があります。この場合、システムプロパティ「javax.xml.soap.MessageFactory」に設定する値は何である必要がありますか

クライアント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;

}
}

サンプルリクエスト

<?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>
9
shaiksha

システム変数_javax.xml.soap.MessageFactory_の値を2つの異なる目的で設定することはできません。デフォルト値はSOAP 1.1に設定されています

システムプロパティ_javax.xml.soap.MessageFactory_を削除し、構築しているクライアントのタイプに応じて使用します

MessageFactory.newInstance()を使用してSOAPメッセージを作成する

SOAP1.1が必要な場合は、デフォルトのコンストラクターを使用してください

_ MessageFactory factory = MessageFactory.newInstance();
_

SOAP1.2が必要な場合は、

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

Javaチュートリアル を参照してください。

アノテーション付きで構成されたJAX-WSクライアント_@BindingType_

_@BindingType_は、JAX-WSクライアントが注釈を使用して構成されている場合、たとえばクライアントがWSDLから生成されている場合に使用されます。アノテーションがポートに追加され、バインディングが_SoapBinding.SOAP11HTTP_BINDING_または_SoapBinding.SOAP12HTTP_BINDING_に設定されます。

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