Spring Boot Apache Camel REST API接收List<MyDtoClass>异常问题
Apache Camel REST DSL 批量创建端点问题解决建议
我用Spring Boot结合Apache Camel REST DSL开发REST API,除createBatch外其余端点均正常工作:
- getById
- getAllDocs
- delete
- deleteBatch
- create
问题描述
createBatch端点(地址:http://localhost:8080/my-rest-api/createBatch)无法接收List类型输入,存在类型转换问题,尝试多种转换方法均失败。
请求体示例:
[ { "shipperNumber": "AAAA", "startDate": "2024-08-05T11:40:15.123456", "endDate": "2024-09-01T02:36:15.678543" }, { "shipperNumber": "BBBB", "startDate": "2024-08-06T14:30:00.654321", "endDate": "2024-09-10T04:15:00.987654" } ]
期望效果:接收List后逐个调用单个create端点。
解决建议
1. 明确请求体的类型绑定
在REST DSL配置中,为createBatch端点指定JSON数据格式并明确泛型类型,避免类型擦除导致的转换失败:
// 定义针对List<你的实体类>的Jackson数据格式 JacksonDataFormat batchDataFormat = new JacksonDataFormat(); batchDataFormat.setType(new TypeReference<List<ShipperDoc>>() {}); // 配置REST端点 rest("/my-rest-api") .post("/createBatch") .consumes("application/json") .produces("application/json") .dataFormat(batchDataFormat) .to("direct:handleBatchCreate");
2. 拆分List并转发到单个create逻辑
在路由中使用split处理器拆分接收到的List,逐个调用单个create的处理逻辑:
// 批量处理路由 from("direct:handleBatchCreate") .split(body()) // 拆分List中的每个元素 .to("direct:handleSingleCreate") // 转发到单个创建的路由 .end() .setBody(constant("批量创建完成")); // 单个创建的路由(复用原create端点的逻辑) from("direct:handleSingleCreate") .bean(你的业务服务类.class, "create"); // 调用业务层的create方法
3. 检查实体类的序列化配置
确保实体类具备正确的序列化/反序列化配置,比如日期字段的格式化:
@Data public class ShipperDoc { private String shipperNumber; @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") private LocalDateTime startDate; @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") private LocalDateTime endDate; }
4. 调试排查转换问题
在路由中添加日志,查看请求体的原始内容和转换后的对象状态,定位问题:
from("direct:handleBatchCreate") .log("原始请求体: ${body}") .split(body()) .log("当前处理的单条数据: ${body}") .to("direct:handleSingleCreate");
同时确认项目中已引入正确的依赖:Spring Boot项目需确保spring-boot-starter-json或camel-jackson-starter依赖存在。
内容的提问来源于stack exchange,提问作者Shahul hameed
相关产品推荐
相关产品推荐

