Apache CXF - SOAP-сообщение, генерируемое клиентом веб-сервиса в Tomcat, отличное от автономного JAR - PullRequest
0 голосов
/ 11 июня 2019

Я новичок в Apache CXF. В настоящее время я занимаюсь разработкой клиента веб-службы с использованием Apache CXF (версия 3.3.2), целью которого является подключение к веб-службе путем отправки и получения сообщения SOAP. Клиент веб-сервиса, который я разрабатываю, будет затем включен в качестве библиотеки в основное приложение, работающее на Tomcat.

Клиент веб-службы правильно работает в моей среде разработки (я использую Eclipse) и успешно получаю данные из веб-службы. Точно так же он работает правильно, если я упаковываю код в виде отдельного файла JAR. Однако, когда я помещаю банку в Tomcat и тестирую ее из основного приложения, он отвечает с исключением ниже:

javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader.
        at org.apache.cxf.jaxws.JaxWsClientProxy.mapException(JaxWsClientProxy.java:195)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145)
        at com.sun.proxy.$Proxy103.searchEmployeeUsers(Unknown Source)
...
...
...
Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
        at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:87)
        at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:53)
        at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:42)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
        at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)
        at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:70)
        at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:35)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:826)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1693)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1570)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1371)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:671)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderIntercepto                   r.java:63)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:440)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
        ... 79 more

Я подозревал, что это исключение происходит от стороны веб-службы, что означает, что моему клиенту веб-службы удалось подключиться и отправить сообщение SOAP веб-службе, но каким-то образом веб-служба не может понять сообщение.

Мне удалось получить исходящее сообщение SOAP из успешного случая (выполнение клиента из Eclipse или из автономного JAR-файла) и неудачного случая (выполнение клиента из Tomcat), и я обнаружил эту разницу:

SOAP-сообщение - успех

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-18d8d608-2918-4bce-833a-e36f38bcc2ef">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soap"/>
...
...

Сообщение SOAP - Не удалось

<soapenv:Envelope xmlns://schemas.xmlsoap.org/soap/envelope/="xmlns:soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-0cd3a846-c466-4393-a434-bab5f5d2ed5a">
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="//schemas.xmlsoap.org/soap/envelope/ soapenv" />
...
...

* Я прошу прощения за то, что не предоставил полный код, так как некоторые части чувствительны, но, надеюсь, этого достаточно, чтобы дать вам представление о проблеме.

Я нахожу это странным, потому что мы не меняем код между кодом в среде разработки, автономным JAR-файлом и Tomcat.

Я не понимаю, в чем причина разницы в генерируемых сообщениях SOAP. Я подозревал, что это может быть как-то связано с зависимостью, поскольку ранее мы также пытались настроить правильную зависимость в приложении tomcat, чтобы этот клиент веб-службы работал.

Что я хочу знать: какая зависимость вызывает эту разницу? Кроме того, что я должен сделать, чтобы исправить это (чтобы сообщение SOAP, сгенерированное в Tomcat, было таким же, как в среде разработки / автономном JAR)? Есть ли лучшая практика?

Спасибо.

...