我在Spring Integration中使用Jaxb2Marshaller
。我有一個入站網關Web服務,當有人調用它時,它會自動解析到JAXB生成的類中。Spring集成Web服務 - Jaxb2Marshaller - 如何使用SAX解析器?
但是當我調試到源代碼時,我看到使用DOM的Jaxb2Marshaller
。我認爲它將使用SAX來將XML數據綁定到Java對象,SAX更快。爲什麼Jaxb2Marshaller
默認使用DOM?我怎樣才能配置它使用SAX?
當我檢查的原稿
的 解組需要資源的一個實例。如果消息有效負載不是源的實例,則將嘗試轉換 。目前支持的字符串,文件和org.w3c.dom.Document有效載荷爲 。通過注入SourceFactory的實現也支持自定義轉換爲Source。 注意 如果沒有設置SourceFactory明確,對UnmarshallingTransformer酒店將 被默認設置爲DomSourceFactory
關於SourceFactory
我們只看到它目前有DomSourceFactory
和StringSourceFactory
。沒有SaxSourceFactory
。
所以我們不能使用SAX和Jaxb2Marshaller
,對不對?
將來有沒有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());
}
}
所以,最終的問題是,我可以配置使用Spring集成Web服務與JAXB使用SAX?我錯過了什麼嗎?
這裏是我的配置:
<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>
謝謝你,最好的問候,
芽阮
@lexicore你能幫我在這:-) –
SAX是不是更快.. 。薩克斯通常比較慢,因爲你需要自定義實現的所有額外的應用程序邏輯... –
看起來像你有一些誤解。你顯示'',但是談論'UnmarshallingTransformer'。第一個完全委託給Spring WS'MarshallingUtils.unmarshal()' –