Spring Integration中如何提取ResponseEntity的body并传入JMS队列
解决Spring Integration中ResponseEntity转JMS消息的问题
我来帮你搞定这个问题——你遇到的核心矛盾是:HTTP Outbound Gateway默认返回ResponseEntity对象,但JMS Outbound Adapter没法直接转换这个类型,因为JMS消息转换器只支持有限的几种payload类型(String、byte数组、Map、Serializable对象)。我们需要在处理链中加一步,把ResponseEntity里的body提取出来,作为新消息的payload传给下游的JMS通道。
方案1:用SpEL表达式快速提取Body(最简配置)
这是最省事的方式,不需要写任何Java代码,直接用Spring Integration的<int:transformer>结合SpEL表达式就能完成Body提取。
修改后的完整配置如下:
<int:chain input-channel="gsInChannel" output-channel="dest-channel"> <int-http:outbound-gateway url="https://ia-zatie.str13.tst.belst.nu/ia-zaatie/rest/signal/v2" http-method="POST" header-mapper="headerMapper" request-factory="sslFactory"> </int-http:outbound-gateway> <!-- 新增转换器:用SpEL提取ResponseEntity的body作为新payload --> <int:transformer expression="payload.body"/> </int:chain>
原理说明
expression="payload.body"是SpEL表达式,这里的payload就是HTTP网关返回的ResponseEntity实例,SpEL会自动调用它的getBody()方法(属性名对应getter方法的约定),把Body内容作为新消息的payload。- 只要你的
ResponseEntity的Body是JMS支持的类型(比如字符串、序列化对象、字节数组),JMS Outbound Adapter就能正常把它转换成JMS消息。
方案2:自定义转换器(应对复杂场景)
如果你的Body需要额外处理(比如类型转换、格式校验、异常处理),可以自定义一个Transformer类,再在配置中引用它:
第一步:编写自定义转换器Java类
import org.springframework.http.ResponseEntity; import org.springframework.integration.transformer.GenericTransformer; public class ResponseEntityBodyExtractor implements GenericTransformer<ResponseEntity<?>, Object> { @Override public Object transform(ResponseEntity<?> responseEntity) { // 这里可以添加自定义逻辑,比如判断Body是否为空、做类型转换等 Object body = responseEntity.getBody(); // 示例:如果Body是某个自定义对象,可在这里做额外处理 // if (body instanceof YourCustomObject) { ... } return body; } }
第二步:在XML配置中注册并引用该转换器
<!-- 注册自定义转换器Bean --> <bean id="responseEntityBodyExtractor" class="com.your.package.ResponseEntityBodyExtractor"/> <int:chain input-channel="gsInChannel" output-channel="dest-channel"> <int-http:outbound-gateway url="https://ia-zatie.str13.tst.belst.nu/ia-zaatie/rest/signal/v2" http-method="POST" header-mapper="headerMapper" request-factory="sslFactory"> </int-http:outbound-gateway> <!-- 使用自定义转换器提取Body --> <int:transformer ref="responseEntityBodyExtractor"/> </int:chain>
额外注意事项
- 确保
ResponseEntity的Body类型符合JMS要求:如果是自定义对象,必须实现Serializable接口;如果是JSON格式的字符串,也可以配置JMS的MappingJackson2MessageConverter来直接处理JSON。 - 你的Spring Integration 4.3.6和Spring Boot 1.4.3版本完全支持上述两种方案,不用担心版本兼容性问题。
内容的提问来源于stack exchange,提问作者Kris Swat
相关产品推荐
相关产品推荐

