0

我一直在寻找一种解决方案,以在代理服务遇到 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。

4

1 回答 1

0

如果您确实控制了输出端,那么您找到的方法(在此处解释)将起作用。但听起来其他东西正在写入/添加无效字符。

如果是这样,我认为您将需要实现一个java.io. FilterInputStream仅去除此类控制字符的方法:它们相对容易找到,尤其是。如果你只是有麻烦0x1F

于 2016-10-28T15:45:24.540 回答