两个不同soap版本的系统属性“javax.xml.soap.MessageFactory”

前端之家收集整理的这篇文章主要介绍了两个不同soap版本的系统属性“javax.xml.soap.MessageFactory”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要与我的应用程序中的两个Web服务进行通信.
对于一个web服务,我需要使用soap1_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>26752018010@wholesale1.com</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>

解决方法

出于两个不同的目的,无法设置系统变量javax.xml.soap.MessageFactory的值.为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 Tutorial.

使用注释@BindingType配置的JAX-WS客户端

使用注释配置JAX-WS客户端时使用@BindingType,例如,如果客户端是从WSDL生成的.注释将添加到Port以将绑定设置为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 {

猜你在找的Java相关文章