为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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个赞

采取:

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 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信