Apache Camel反序列化后如何访问原始输入消息?
解决Apache Camel反序列化后获取原始JSON消息的方法
方法1:反序列化前将原始消息存入Exchange属性
在执行反序列化操作前,把原始JSON字符串保存到Exchange的自定义属性中,后续Process组件直接读取该属性即可:
from("activemq:queue:inputQueue") // 将原始消息存入自定义属性 .setProperty("OriginalInputJson", body()) // 执行JSON到Java对象的反序列化 .unmarshal().json(JsonLibrary.Jackson, YourTargetClass.class) .process(exchange -> { // 从属性中获取原始JSON字符串 String originalJson = exchange.getProperty("OriginalInputJson", String.class); // 获取反序列化后的Java对象 YourTargetClass pojo = exchange.getIn().getBody(YourTargetClass.class); // 执行后续业务逻辑 });
方法2:手动反序列化,不覆盖原始消息体
绕过Camel自动反序列化的消息体覆盖逻辑,手动完成反序列化并将结果存入属性,保留原始消息在body中:
from("activemq:queue:inputQueue") .process(exchange -> { String originalJson = exchange.getIn().getBody(String.class); // 手动完成JSON反序列化 YourTargetClass pojo = new ObjectMapper().readValue(originalJson, YourTargetClass.class); // 将反序列化结果存入属性 exchange.setProperty("DeserializedPojo", pojo); }) .process(exchange -> { // 直接从body读取原始JSON String originalJson = exchange.getIn().getBody(String.class); // 从属性获取反序列化后的对象 YourTargetClass pojo = exchange.getProperty("DeserializedPojo", YourTargetClass.class); });
注意事项
- 使用Camel内置的
unmarshal().json()时,默认会覆盖Exchange的In消息体,因此必须在反序列化步骤前主动保存原始内容。 - 自定义属性名建议使用业务相关命名,避免与Camel内置属性(如
Camel*前缀)冲突。
内容的提问来源于stack exchange,提问作者Kumaran
相关产品推荐
相关产品推荐

