我需要与我的应用程序中的两个Web服务进行通信.
对于一个web服务,我需要使用soap1_1版本,而另一个soap版本是soap1_2.在这种情况下,应该为系统属性“ javax.xml.soap.MessageFactory”设置的值是什么
对于一个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);
使用注释@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 {