2016-10-27 3 views
0

Я искал решение об изменении или отмене ответа SOAP от прокси-службы до того, как он попадает в исключение DeserializationException от Woodstox. Ниже приводится исключение, которое я получаю. Прежде чем раздавать с прямыми ответами, как CTRL-Чара не действительна для XML, создания пользовательских SOAP-обработчика сообщений некоторых факты:Как настроить Spring/Woodstox jaxws для извлечения CTRL-CHAR из ответа службы 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 выше, 't work: (так что, не нарушая запроса и ответа на этот прокси-сервис, я просто хочу Woodstox или Spring или что-нибудь, что я могу добавить для фильтрации неверных символов из ответа, прежде чем выбросить ошибку и сломать связь.

org.springframework.remoting.RemoteAccessException: не удалось получить доступ к удаленной службе в [null]; вложенное исключение - com.sun.xml.ws.encoding.soap.DeserializationException: Fa iled для чтения ответа: javax.xml.bind.UnmarshalException - со связанным исключением: [com.ctc.wstx.exc.WstxUnexpectedCharException: нелегальный символ ((CTRL-CHAR, код 31)) в [row, col { неизвестно источника}]: [+91222]] на 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 (JdkDynamicAopProxy.java:207) на com.sun.proxy. $ Proxy42 .salesOrderInfo (Неизвестный источник)

ответ

0

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

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

+0

Как я могу внедрить реализацию java.io.FilterInputStream в конфигурацию? – UCJava

+0

@UCJava, к сожалению, я не знаю ответа на это, если вы не контролируете фактический вызов (что звучит так, как будто вы этого не делаете). Таким образом, вам, возможно, придется выяснить, как получить сервер, чтобы правильно сформированные правильные символы управления XML не разрешены, поэтому who-/whatever создает контент, а не XML по определению. – StaxMan

Смежные вопросы