亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Spring 集成中解組 Xml 負載后保留 JMS 標頭

如何在 Spring 集成中解組 Xml 負載后保留 JMS 標頭

慕斯王 2023-07-19 14:59:13
我正在使用Jmeter發送帶有 XML 有效負載和一些contentType帶有值的自定義標頭的 JMS 消息。text/jsontext/xml我的 Spring 集成配置如下所示:<jms:message-driven-channel-adapter channel="jmsInChannel" destination-name="queue.demo" connection-factory="jmsConnectionFactory1" /><int:channel id="jmsInChannel" /><int:header-value-router input-channel="jmsInChannel" header-name="contentType" default-output-channel="nullChannel">    <int:mapping value="text/json" channel="jsonTransformerChannel" />    <int:mapping value="text/xml" channel="xmlTransformerChannel" /></int:header-value-router>到目前為止,一切都很順利,消息已成功路由到各自的變壓器。我的問題是,當它是 XML 有效負載時,我首先使用 JAXB Unmarshaller<ixml:unmarshalling-transofmer ../>以及http://www.springframework.org/schema/integration/xml.我可以獲取有效負載,但它無法隨后將消息作為 JMS 消息進行處理,它變成了純 POJO。<int: ../>所以我丟失了標頭,并且在不序列化 POJO 的情況下無法使用組件,這不是我想要實現的目標。我找到了一個解決方法,我在 java 中定義了自己的 Unmarshalling bean,如下所示:<int:channel id="xmlTransformerChannel" /><int:transformer input-channel="xmlTransformerChannel" ref="xmlMsgToCustomerPojoTransformer" output-channel="enrichInChannel" />方法:@SuppressWarnings("rawtypes")public Message transform(String message) {    logger.info("Message Received \r\n" + message);    try {        MyModel myModel = (MyModel) unmarshaller.unmarshal(new StreamSource(new StringReader(message)));        return MessageBuilder.withPayload(myModel).build();    } catch (XmlMappingException e) {        return MessageBuilder.withPayload(e).build();    } catch (Exception e) {        return MessageBuilder.withPayload(e).build();    }}我可以成功地將消息作為 Spring 集成消息進行處理,但我丟失了原始的自定義 JMS 標頭。相比之下,我所要做的就是轉換 json 有效負載并保留消息格式并保留我的自定義標頭是以下 xml 配置:<int:channel id="jsonTransformerChannel" /><int:json-to-object-transformer input-channel="jsonTransformerChannel" output-channel="enrichInChannel" type="com.alrawas.ig5.MyModel" />我的問題是,在解組 xml 負載后如何保留原始的自定義 JMS 標頭?
查看完整描述

2 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

當您開發 custom 時transformer,您需要記住,返回 aMessage<?>會讓您完全控制其內容。

當轉換器函數返回 a 時Message,它不會填充任何請求標頭。

因此,您public Message transform(String message) {必須期望 aMessage作為輸入,并且需要將請求消息中的所有標頭復制到回復消息。上有相應的方法MessageBuilder。

另一方面,完全不清楚為什么需要Message在此處返回 a ,因為 Spring Integration 中的所有內容都將Message在發送到輸出通道之前被包裝。


查看完整回答
反對 回復 2023-07-19
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

采?。?/p>

ClassCastException 后來在最后一個路由器中發生,是因為我命名了自定義 header contentType。這是內部使用的默認 jms 標頭。當我將其值更改為 時text/xml,最后一個路由器String route(Message<MyModel> myModel)嘗試將 json 轉換為 MyModel,但它失敗了,因為標頭不再像application/json應有的那樣,而是text/xml。這導致了 ClassCastException。

所以我擺脫了自定義 xml 解組邏輯 bean。我重命名了自定義標題。并用過<ixml:unmarshalling-transformer ../>。

它使用 xml 配置工作,無需額外的自定義 java bean。


查看完整回答
反對 回復 2023-07-19
  • 2 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號