Как настроить Spring / Woodstox jaxws для удаления CTRL-CHAR из ответа прокси-службы SOAP

Я искал решение для изменения/удаления ответа 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(неизвестный источник)


person UCJava    schedule 27.10.2016    source источник


Ответы (1)


Если вы контролировали выходную сторону, метод, который вы нашли (объясненный здесь) будет работать. Но похоже, что что-то еще пишет/добавляет недопустимые символы.

Если это так, я думаю, вам нужно будет реализовать java.io. FilterInputStream, который просто удаляет такие управляющие символы: их относительно легко найти, особенно. если у вас проблемы только с 0x1F.

person StaxMan    schedule 28.10.2016
comment
Как тогда я могу внедрить реализацию java.io.FilterInputStream в конфигурацию? - person UCJava; 28.10.2016
comment
@UCJava, к сожалению, я не знаю ответа на этот вопрос, если вы не контролируете фактический вызов (похоже, что вы этого не делаете). Таким образом, вам, возможно, придется выяснить, как заставить сервер давать правильно сформированный правильный XML - управляющие символы не допускаются, поэтому кто-/что бы ни производил контент, это не XML по определению. - person StaxMan; 28.10.2016