2016-10-27 11 views
0

나는 Woodstox의 DeserializationException에 부딪치기 전에 프록시 서비스의 SOAP 응답을 변경/제거하는 솔루션을 찾고자했습니다. 아래는 제가 얻는 예외입니다.프록시 SOAP 서비스 응답에서 CTRL-CHAR을 제거하도록 Spring/Woodstox jaxws를 구성하는 방법

  • 이것은 그래서 톰캣,

  • 는 WSDL을하고 자바 데스크톱 응용 프로그램입니다 : CTRL-CHAR의 같은 straigt 답변을 제공하기 전에 몇 가지 사실 사용자 정의 SOAP 메시지 핸들러를 생성, XML에 유효하지 않습니다

    <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> 
    
: 스텁은 2.2.8

  • 웹 서비스 클라이언트 구성은 다음과 같다 JAX-WS RI를 통해 생성된다

    나는 다음과 같은 구성을 시도했지만 작동하지 않았다 :

    <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을 만드는 시도했지만 그들은 도움이되지 않았다.

    응답 본문에서 유니 코드 문자를 대체하고 응답 본문을 manupulating 한 후에이를 소비하는 방법이 있다는 것을 알고 있지만 위의 WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER 구성 에서처럼 필터를 찾고 있습니다. (요청을 깨고이 프록시 서비스에 응답하지 않고, Woodstox 또는 Spring 또는 오류를 던지고 통신을 끊기 전에 응답에서 유효하지 않은 문자를 필터링하도록 사용자 정의 할 수있는 모든 것을 원합니다.

    org.springframework.remoting.RemoteAccessException : [null]에서 원격 서비스에 액세스 할 수 없으며 중첩 예외는 com.sun.xml.ws.encoding.soap.DeserializationException : Fa입니다. 응답을 읽으려고했는지 여부 : - 링크 예외 : [com.ctc.wstx.exc.WstxUnexpectedCharException : 잘못된 문자 ((CTRL-CHAR, 코드 31)) at [row, col { 알 소스}] [91,222] org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.invoke에서 org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke (JaxWsPortClientInterceptor.java:565) 에서 (JaxWsPortClientInterceptor.java:541) com.sun.proxy에서 org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:207) 에서 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) 에서 . $ Proxy42 .salesOrderInfo (알 수없는 소스)

  • 답변

    0

    출력면을 제어했다면 발견 된 방법 (here)이 작동합니다. 하지만 다른 문자를 쓰거나 추가하는 것과 같은 소리가납니다.

    그렇다면 제어 문자를 제거하는 java.io. FilterInputStream을 구현해야한다고 생각합니다. 비교적 쉽게 찾을 수 있습니다. 0x1F으로 문제가있는 경우

    +0

    어떻게 구성에 java.io.FilterInputStream 구현을 삽입 할 수 있습니까? – UCJava

    +0

    @UCJava 불행히도 나는 실제적인 호출 (당신이하지 않는 것처럼 들린다)을 제어하지 않으면, 그것에 대한 답을 모른다. 따라서 올바른 형식의 XML 제어 문자를 서버에 제공하는 방법을 알아 내야 할 수도 있습니다. 따라서 콘텐츠를 생성하는 사람은 무엇이든 정의에 따라 XML이 아닙니다. – StaxMan