2015-08-26 4 views
0

Чтобы облегчить тестирование моего клиента 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, я предполагаю, что я что-то пропустил.

Спасибо!

ответ

0

Оказывается, модель SOAP, сделанная командой, отвечающей за сервер, действительно неоптимальна (чтобы оставаться вежливой); На самом деле я мог догадаться, что используемое по умолчанию «Microsoft» пространства имен использовалось, непосредственно взятое из примера примера и не адаптированное к нашему контексту.

Класс оболочки действительно генерируется, и я этого не замечал раньше. Поэтому я инициализирую класс-оболочку через ObjectFactory, но поскольку эта оболочка даже не принимает объект домена в качестве атрибута, мне сначала нужно самостоятельно настроить объект домена в JAXBElement, а затем установить результат на обертке. Наконец, маршаллер, сконфигурированный в Spring, начнет входить и выберет класс-оболочку в правильный запрос.

же гимнастические я должен делать с ответом, проходя через двойной немаршалинг ...

Так что я думаю, реальный ответ должен иметь надлежащий SOAP modelization на месте.

Смежные вопросы