2017-01-11 13 views
2

私はSpring IntegrationでJaxb2Marshallerを使用しています。私は着信ゲートウェイWebサービスを持っています。誰かがそれを呼び出すと、自動的にJAXB生成クラスに解析されます。Spring統合Webサービス - Jaxb2Marshaller - どのようにSAX Parserを使用できますか?

しかし、ソースにデバッグすると、DOMを使用してJaxb2Marshallerが表示されます。 XMLデータをJavaオブジェクトにバインドするためにSAXを使用すると思っていましたが、SAXは高速です。なぜJaxb2MarshallerのDOMをデフォルトで使用するのですか? SAXを使用するように設定するにはどうすればよいですか?

私は文書

アンマーシャラーを確認したよう

は、ソースのインスタンスが必要です。メッセージのペイロードがSourceのインスタンスでない場合は、 変換が試行されます。現在、String、File、org.w3c.dom.Documentペイロードは に対応しています。 Sourceへのカスタム変換は、 SourceFactoryの実装をインジェクトすることによってもサポートされています。 SourceFactoryが明示的に設定されていない場合 注 、UnmarshallingTransformerのプロパティは、我々は唯一、現在それをそれを見ることができますSourceFactory

http://docs.spring.io/spring-integration/api/org/springframework/integration/xml/source/SourceFactory.html

についてDomSourceFactory

にデフォルトで に設定されます。 DomSourceFactoryおよびStringSourceFactoryを有する。 SaxSourceFactoryはありません。

Jaxb2MarshallerでSAXを使用することはできません。

今後はSaxSourceFactoryになりますか?または決して?

奇妙なことは、私はJaxb2Marshallerを確認したときに、私はコードをまだSAX

XMLReader xmlReader = null; 
    InputSource inputSource = null; 

    if (source instanceof SAXSource) { 
     SAXSource saxSource = (SAXSource) source; 
     xmlReader = saxSource.getXMLReader(); 
     inputSource = saxSource.getInputSource(); 
    } 
    else if (source instanceof StreamSource) { 
     StreamSource streamSource = (StreamSource) source; 
     if (streamSource.getInputStream() != null) { 
      inputSource = new InputSource(streamSource.getInputStream()); 
     } 
     else if (streamSource.getReader() != null) { 
      inputSource = new InputSource(streamSource.getReader()); 
     } 
     else { 
      inputSource = new InputSource(streamSource.getSystemId()); 
     } 
    } 

を扱う参照、最後の質問は、私はSAXとJAXBと春の統合Webサービスを使用して設定することができますされていますか?私は何かを逃したのですか?ここで

は私の設定です:

<ws:inbound-gateway id="inbound-gateway" request-channel="RequestChannel" reply-channel="ResponseChannel" 
     marshaller="marshaller"  unmarshaller="marshaller" /> 
<int:channel id="RequestChannel" /> 
<int:channel id="ResponseChannel" /> 

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="contextPath" value="com.example.webservice.api"/> 
</bean> 

は名前MessageDispatcherServlet.DEFAULT_MESSAGE_FACTORY_BEAN_NAMEAxiomSoapMessageFactory Beanを構成するようにしてください

ニャチャングエン、

+0

@lexicoreあなたはこの:-)に私を助けてもらえ –

+0

サックスが速くない..です。サックスは、あなたがカスタム実装する必要があるすべての余分なアプリケーションロジックのために、しばしば遅いです... –

+0

あなたはいくつかの誤解があるように見えます。あなたは ''を表示しますが、 'UnmarshallingTransformer'について話します。最初のものはSpring WS 'MarshallingUtils.unmarshal()'に完全に委譲されています –

答えて

0

をあなたとよろしくお願いします。デフォルトでは

それは非整列化する前に、正確にこれを行いSaajSoapMessageFactoryです:

公理はSTAXに基づいて
public Source getPayloadSource() { 
    SOAPElement bodyElement = SaajUtils.getFirstBodyElement(getSaajBody()); 
    return bodyElement != null ? new DOMSource(bodyElement) : null; 
} 

XMLStreamReader streamReader = getStreamReader(payloadElement); 
return StaxUtils.createCustomStaxSource(streamReader); 

そしてclass StaxSource extends SAXSource {

+0

はい、構成しようとしました^ _ ^成功しました。現在、JAXBはStAXパーサーを使用してアンマーシャリングしています(SAXよりも優れています)。 –

+0

SAX Source(JAXBはSAXParserを呼び出します)を取得するには、getPayloadSource()がSAXSourceを返すサードパーティのライブラリを見つける必要があります^^ ありがとう –

+0

答えを受け入れて読む時間手動で慎重に –

1

私が使用しているWebServiceGatewaySupportクラスとBeanとしてAxiomSoapMessageFactoryをアプリケーションコンテキストに追加しようとしましたが、WebServiceTemplateがそうであることがわかりましたWebServiceMessageFactoryをアプリケーションコンテキストからロードしないでください。だから私は、コンストラクタを追加することになってしまった:

public class SomeServiceImpl extends WebServiceGatewaySupport implements SomeService { 

    public SomeServiceImpl(WebServiceMessageFactory messageFactory) { 
     super(messageFactory); 
    } 
} 

@Configurationクラスで自分自身をサービスを構築:

@Configuration 
public class WebServicesConfiguration { 

    private WebServiceMessageFactory webServiceMessageFactory = new AxiomSoapMessageFactory(); 

    @Bean 
    public SomeService someService() { 
     return new SomeServiceImpl(webServiceMessageFactory); 
    } 
} 
関連する問題