Чтобы облегчить тестирование моего клиента SOAP (используя MockWebServiceServer), я хочу использовать webserviceTemplate Spring.Как объединить Spring webserviceTemplate с информацией @RequestWrapper?
Конечная точка SOAP - это .Net-сервер. На основе wsdl я могу сгенерировать компоненты (в основном класс Request) и интерфейс конечной точки.
Сгенерированный интерфейс ниже:
@WebService(targetNamespace = "http://Microsoft.ServiceModel.Samples", name = "IWcfRed")
@XmlSeeAlso({ObjectFactory.class, com.microsoft.schemas._2003._10.serialization.ObjectFactory.class})
public interface IWcfRed {
@WebResult(name = "CallCheckXmlResult", targetNamespace = "http://Microsoft.ServiceModel.Samples")
@Action(input = "http://Microsoft.ServiceModel.Samples/IWcfRed/CallCheckXml", output = "http://Microsoft.ServiceModel.Samples/IWcfRed/CallCheckXmlResponse")
@RequestWrapper(localName = "CallCheckXml", targetNamespace = "http://Microsoft.ServiceModel.Samples", className = "samples.servicemodel.microsoft.CallCheckXml")
@WebMethod(operationName = "CallCheckXml", action = "http://Microsoft.ServiceModel.Samples/IWcfRed/CallCheckXml")
@ResponseWrapper(localName = "CallCheckXmlResponse", targetNamespace = "http://Microsoft.ServiceModel.Samples", className = "samples.servicemodel.microsoft.CallCheckXmlResponse")
public java.lang.String callCheckXml(
@WebParam(name = "xmlRequest", targetNamespace = "http://Microsoft.ServiceModel.Samples")
java.lang.String xmlRequest
);
}
мой webserviceTemplate настроен правильно (я думаю) с ИАС и messageFactory и defaultUri, чтобы отправить что-то.
Так что, когда я называю этот код
Request myRequest=generateDummyRequest();
webServiceTemplate.marshalSendAndReceive(myRequest,new SoapActionCallback ("http://Microsoft.ServiceModel.Samples/IWcfRed/CallCheckXml"));
myRequest получает выстроил в XML, и я могу видеть тело запроса начинается с <Request>
тега.
Я подумал, что было бы хорошо, и достаточно, но я получаю очень четкое сообщение об ошибке от сервера:
org.springframework.ws.soap.client.SoapFaultClientException: Ошибка в десериализации тела сообщения с запросом для операции «CallCheckXml». OperationFormatter столкнулся с недействительным телом сообщения. Ожидается, что найти тип узла «Элемент» с именем «CallCheckXml» и пространство имен 'http://Microsoft.ServiceModel.Samples'. Найдено типа узла «Элемент» с именем «Request» и пространство имен «»
Так что мой запрос должен быть обернут в элементе CallCheckXml, достаточно справедливо. И я понимаю, что это фактически определено в сгенерированном интерфейсе с информацией в аннотации @RequestWrapper, поэтому это имеет смысл.
Но как мне получить весну, чтобы сделать это красиво для меня? Нужно ли мне это делать в WebServiceMessageCallback? или я должен забыть webservicetemplate и перейти на JaxWsPortProxyFactoryBean?
Ни одно из этих двух решений не кажется мне очень привлекательным. И если webserviceTemplate является стандартом Spring для операций SOAP, я предполагаю, что я что-то пропустил.
Спасибо!