2017-01-07 100 views
1

Я хочу проверить, содержит ли тело SOAP локальное имя, например pos:searchText. Я должен использовать MessageContext, потому что я использую EndpointInterceptorAdapter.Spring получить SOAP все локальные имена в теле

Вот мой запрос SOAP.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
    <pos:getSearchRequest> 
    <pos:searchText>some Text</pos:searchText> 
    <pos:anotherField>example</pos:anotherField> 
    </pos:getSearchRequest> 
</soapenv:Body> 
</soapenv:Envelope> 

И unmarshalling не работает, потому что я перехватил весь запрос и нет модели для этого.

Как получить все местные названия, например pos:searchText?

ответ

0

Было бы полезно посмотреть, как вы пытались «отменить» ваш запрос SOAP, а также более подробную информацию об ошибках или трудностях, которые у вас были с этим. В недавнем случае, когда я не мог отменить мое сообщение SOAP из-за абстракции моего перехватчика, мне пришлось сделать его строкой XML, а затем легко найти элементы, которые мне нужны с выражением XPath. Может быть, это поможет вам тоже:

private String extractSearchText(MessageContext messageContext) throws IOException, XPathExpressionException { 
    ByteArrayOutputStream soapResponseOutputStream = new ByteArrayOutputStream(); 
    messageContext.getResponse().writeTo(soapResponseOutputStream); 
    InputSource soapResponseInputSource = new InputSource(new StringReader(new String(soapResponseOutputStream.toByteArray()))); 
    return (String) xpath.evaluate("//pos:searchText", soapResponseInputSource, XPathConstants.STRING); 
} 

PS: Я действительно не могу понять, почему вы не можете маршализацию ваш запрос. С более подробной информацией было бы легче помочь вам, и я потратил бы на это немного усилий, поскольку это определенно правильный способ сделать то, что вам нужно.