Развернуть Metro Web Service с привязками SOAP11 и SOAP12 по одному URL?
У меня есть устаревший веб-сервис, который я пытаюсь перенести в Glassfish / Metro из Axis2, и я наткнулся на проблему:
Существует один файл WSDL, с одним wsdl:service
элемент, который содержит ссылку на два wsdl:port
элементы, один для SOAP11 и один для SOAP12.
В частности, эта часть WSDL выглядит так:
<wsdl:service name="WebServiceInterface">
<wsdl:port name="WebServiceSOAP11port"
binding="ns:WebServiceSOAP11Binding">
<soap:address
location="http://localhost:8081/axis2/services/WebService" />
</wsdl:port>
<wsdl:port name="WebServiceSOAP12port"
binding="ns:WebServiceSOAP12Binding">
<soap12:address
location="http://localhost:8081/axis2/services/WebService" />
</wsdl:port>
</wsdl:service>
Пытаясь настроить классы для работы в качестве конечных точек, у меня есть следующее:
@WebService(name = "WebServicePortType", targetNamespace = "http://abc/", portName="WebServiceSOAP11port", endpointInterface = "abc.WebServicePortType", serviceName = "WebServiceInterface", wsdlLocation = "WebService.wsdl")
@BindingType(SOAPBinding.SOAP11HTTP_BINDING)
public class WebServiceSoap11Impl extends WebServiceBase implements WebServicePortType {
// Superclass handles actual method calls - this is just here for binding to Soap 1.1.
}
@WebService(name = "WebServicePortType", targetNamespace = "http://abc/", portName="WebServiceSOAP12port", endpointInterface = "abc.WebServicePortType", serviceName = "WebServiceInterface", wsdlLocation = "WebService.wsdl")
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public class WebServiceSoap12Impl extends WebServiceBase implements WebServicePortType {
// Superclass handles actual method calls - this is just here for binding to Soap 1.2.
}
Теперь, это хорошо работает для привязок SOAP11, но если я пытаюсь использовать привязку SOAP12 через soapUI, я получаю следующую ошибку:
[#|2013-02-25T22:31:25.299+1300|SEVERE|glassfish3.1.2|com.sun.xml.ws.transport.http.HttpAdapter|_ThreadID=227;_ThreadName=http-thread-pool-8782(5);|Unsupported Content-Type: application/soap+xml;charset=UTF-8;action="urn:heartBeat" Supported ones are: [text/xml]
com.sun.xml.ws.server.UnsupportedMediaException: Unsupported Content-Type: application/soap+xml;charset=UTF-8;action="urn:heartBeat" Supported ones are: [text/xml]
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:315)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:149)
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:361)
at com.sun.xml.ws.transport.http.HttpAdapter.decodePacket(HttpAdapter.java:343)
at com.sun.xml.ws.transport.http.HttpAdapter.access$400(HttpAdapter.java:99)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:623)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163)
at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:145)
Очевидно, что Content-Type
верно для SOAP12, но по какой-то причине Metro не понимает, что у меня есть два класса для одной и той же конечной точки - 1, связанный с SOAP11, 1 с SOAP12. Axis2, похоже, в состоянии справиться с этим вариантом использования. Метро поддерживает это? Или я должен предоставить отдельные конечные точки для SOAP11 и 12? Или мне просто отказаться от поддержки одного из них?
Я использую Glassfish 3.1.2.2 в Ubuntu 10.04 с Java 1.7.0_4