2017-01-25 11 views
7

Мне нужно связаться с двумя веб-службами из моего приложения. Для одного веб-сервиса мне нужно использовать версию soap1_1, а для другой версии мыла - soap1_2. В этом случае то, что должно быть установлено значение для свойств системы "javax.xml.soap.MessageFactory"Системное свойство "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; 

} 
} 

пример запроса

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

ответ

3

Это не представляется возможным установите значение Системная переменная javax.xml.soap.MessageFactory для двух разных целей. Значение по умолчанию устанавливаются для SOAP 1.1

Снимите систему свойств javax.xml.soap.MessageFactory и в зависимости от типа клиента, вы строите использование

Строительства сообщения мыла с MessageFactory.newInstance()

Если вы хотите SOAP1.1 используйте конструктор по умолчанию

MessageFactory factory = MessageFactory.newInstance(); 

Если вы хотите SOAP1.2, используйте

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

См. Java Tutorial.

клиенты 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 { 
+0

Я строю двух клиентов, чтобы поговорить с двумя различными веб-службами. добавили пример кода двух клиентов. Для обоих клиентов я использую почти один и тот же бит кода, только конечная точка отличается. В обоих случаях я создаю часть тела запроса с помощью xslt и передаю сгенерированный xml в качестве входного сигнала для soapclient – shaiksha

+0

. Я обновил ответ. См. В первом случае, как настроить 'MessageFactory.newInstance()' для Soap 1.1 или 1.2 – pedrofb

+0

, я делал то же самое раньше, но я получал неподдерживаемую ошибку версии при анализе ответа. значение по умолчанию javax.xml.xoap.messageFactory было установлено в SOAP1.1, и полученный ответ был из soap1_2, поэтому я добавил System.setProperty ("javax.xml.soap.MessageFactory", "com.sun.xml.internal .messaging.saaj.soap.ver1_2.SOAPMessageFactory1_2Impl "); к коду, и он решил проблему, я еще не тестировал другой интерфейс, который имеет soap1.1, но я верю, что получаю ту же неподдерживаемую ошибку. – shaiksha