我一直在寻找一种解决方案,以在代理服务遇到 Woodstox 的 DeserializationException 之前更改/去除 SOAP 响应。下面是我得到的例外。在给出像 CTRL-CHAR 对 XML 无效的直截了当的答案之前,创建一个自定义 SOAP 消息处理程序一些事实:
这是一个 java 桌面应用程序,所以没有 Tomcat
通过 JAX-WS RI 2.2.8 生成 wsdl 和存根
Web 服务客户端配置如下:
<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,但它们也没有帮助。
我知道有一些方法可以从响应正文中搜索和替换 unicode 字符并在处理响应正文后使用它,但我正在寻找的是一个过滤器,就像上面的 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)) 在 [row,col {unknown-source}]: [91,222]] 在 org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:565) 在 org.springframework.remoting。 jaxws.JaxWsPortClientInterceptor.invoke(JaxWsPortClientInterceptor.java:541) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)在com.sun。