Я искал решение для изменения/удаления ответа SOAP от прокси-службы до того, как он попадет в DeserializationException Woodstox. Ниже приведено исключение, которое я получаю. Прежде чем давать прямые ответы, такие как CTRL-CHAR, недействительны для XML, создайте собственный обработчик сообщений SOAP, некоторые факты:
Это настольное приложение Java, поэтому Tomcat не
Создать wsdl и заглушки через JAX-WS RI 2.2.8
Конфигурация клиента веб-службы выглядит следующим образом:
<bean id="serviceProxy" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> <property name="serviceInterface" value="local generated stub"/> <property name="wsdlDocumentUrl" value="--wsdl URL--"/> <property name="namespaceUri" value="urn:address"/> <property name="serviceName" value="proxyService"/> <property name="portName" value="Some_Wsi_HandlerPort"/> <property name="lookupServiceOnStartup" value="false" /> </bean>
Я попробовал следующую конфигурацию, но это не сработало:
<jaxws:client id="localService">
<jaxws:properties>
<entry key="javax.xml.stream.XMLOutputFactory">
<ref bean="xmlOutputFactory"/>
</entry>
</jaxws:properties>
</jaxws:client>
<bean id="invalidCharHandler" class="com.ctc.wstx.api.InvalidCharHandler$ReplacingHandler">
<constructor-arg value=" "/>
</bean>
<bean id="xmlOutputFactory" class="com.ctc.wstx.stax.WstxOutputFactory"/>
<beanclass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="xmlOutputFactory" />
</property>
<property name="targetMethod">
<value>setProperty</value>
</property>
<property name="arguments">
<list>
<util:constant static-field="com.ctc.wstx.api.WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER"/>
<ref bean="invalidCharHandler" />
</list>
</property>
</bean>
Я также пытался создать собственные SOAPHandler и LogicalHandler, но они тоже не помогли.
Я знаю, что есть методы для поиска и замены символов Юникода в теле ответа и их использования после манипулирования телом ответа, но я ищу фильтр, как в конфигурации WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER выше, который не работал: (поэтому, не нарушая запрос и ответ на эту прокси-службу, я просто хочу, чтобы Woodstox или Spring или что-то еще, что я могу ввести, настроено для фильтрации недопустимых символов из ответа, прежде чем выдавать ошибку и прерывать связь.
org.springframework.remoting.RemoteAccessException: не удалось получить доступ к удаленной службе в [null]; вложенным исключением является com.sun.xml.ws.encoding.soap.DeserializationException: не удалось прочитать ответ: javax.xml.bind.UnmarshalException - со связанным исключением: [com.ctc.wstx.exc.WstxUnexpectedCharException: недопустимый символ (( CTRL-CHAR, код 31)) в [строка, столбец {неизвестный источник}]: [91,222]] в org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:565) в org.springframework.remoting. jaxws.JaxWsPortClientInterceptor.invoke(JaxWsPortClientInterceptor.java:541) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAop207.java) на com.sun.proxy.$Proxy42.salesOrderInfo(неизвестный источник)