Apache Camel Exchange中JSON集合转换为Java对象返回Null的解决方法咨询
解决Apache Camel中JSON集合转Java对象的问题
看起来你在把Exchange里的JSON集合转成Java List时踩了两个主要坑:JSON格式本身有语法错误,以及类型转换的方式不对。咱们一步步来解决:
1. 先修复原始JSON的语法问题
你提供的JSON有多处语法错误,比如字段后缺失逗号、未闭合的括号、空值写法不规范,而且集合没有用[]包裹。修复后的正确JSON应该是这样:
[ { "identifier": { "domain": "transport", "id": "123", "version": 1 }, "record": "NEW", "payload": { "personalDetails": { "name": "bla bla bla", "dob": "" }, "reason": "" } }, { "identifier": { "domain": "transport", "id": "123", "version": 1 }, "record": "NEW", "payload": { "personalDetails": { "name": "bla bla bla", "dob": "" }, "reason": "" } } ]
注意:你原来的pesonalDetails拼写错误,应该是personalDetails,这会导致字段映射失败,一定要修正。
2. 修正Java对象转换的代码
你的代码里直接用RespModel.class去获取Body,但Exchange里是JSON数组,对应的Java类型是List<RespModel>,不能直接强转。在Apache Camel中,要获取泛型集合类型的Body,需要使用TypeReference来指定具体类型:
正确的转换代码
try { // 使用TypeReference明确指定List<RespModel>类型 List<RespModel> records = exchange.getIn().getBody(new TypeReference<List<RespModel>>() {}); if (records != null) { System.out.println("转换成功,集合大小:" + records.size()); } else { System.out.println("转换后集合为空"); } } catch (Exception e) { System.out.println("转换失败:" + e.getLocalizedMessage()); e.printStackTrace(); // 建议打印完整堆栈,方便排查 }
3. 确保RespModel类的结构与JSON字段匹配
你的RespModel类需要和JSON的层级结构对应,字段名称要一致(或者用@JsonProperty注解映射)。示例如下:
import com.fasterxml.jackson.annotation.JsonProperty; public class RespModel { private Identifier identifier; private String record; private Payload payload; // 生成getter和setter方法 public Identifier getIdentifier() { return identifier; } public void setIdentifier(Identifier identifier) { this.identifier = identifier; } public String getRecord() { return record; } public void setRecord(String record) { this.record = record; } public Payload getPayload() { return payload; } public void setPayload(Payload payload) { this.payload = payload; } // 内部类Identifier public static class Identifier { private String domain; private String id; private int version; // getter和setter public String getDomain() { return domain; } public void setDomain(String domain) { this.domain = domain; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } } // 内部类Payload public static class Payload { // 注意这里的字段名要和JSON里的一致,修正拼写错误 @JsonProperty("personalDetails") private PersonalDetails personalDetails; private String reason; // getter和setter public PersonalDetails getPersonalDetails() { return personalDetails; } public void setPersonalDetails(PersonalDetails personalDetails) { this.personalDetails = personalDetails; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } } // 内部类PersonalDetails public static class PersonalDetails { private String name; private String dob; // getter和setter public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDob() { return dob; } public void setDob(String dob) { this.dob = dob; } } }
4. 额外注意事项
- 确保你的Camel路由中已经配置了Jackson数据格式组件(比如
jackson-databind依赖),Camel默认会用Jackson来处理JSON和Java对象的转换。 - 如果JSON字段和Java字段名称不一致,一定要用
@JsonProperty注解做映射,比如上面修正的personalDetails字段。
这样调整后,应该就能成功把JSON集合转换成List<RespModel>了。
内容的提问来源于stack exchange,提问作者Trups
相关产品推荐
相关产品推荐

