【发布时间】:2023-02-16 03:51:18
【问题描述】:
在 Spring Boot 2.7 中。用 Kotlin 编写的 Camel 3.20.x 项目 我有一个接收 JSON 负载的 REST 端点。我添加了 Camel Jackson 依赖项来处理 JSON<->POJO 转换:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jackson-starter</artifactId>
<version>${camel.version}</version>
</dependency>
data class Payment(val iban: String, val amount: Float)
rest("/payments")
.post("/")
.to("direct:processPayment")
from("direct:processPayment")
.log("Body \${body}")
.log("Body \${body.getClass()}")
这些是路线的日志:
Body {"payment":{"iban":"ABCD","amount":150.0}}
Body class org.apache.camel.converter.stream.InputStreamCache
如您所见,正文正确显示为字符串,但是,类型是 InputStreamCache 而不是我的付款 DTO。
我更新了将正文解组到支付 DTO 的路由:
from("direct:processPayment")
.unmarshal().json(JsonLibrary.Jackson, Payment::class.java)
.log("Body \${body}")
.log("Body \${body.getClass()}")
这失败了:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `xxx.Payment` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
为什么转换不起作用?
【问题讨论】:
-
你能展示你的付款课程吗?是否有默认构造函数(没有争论) ?
-
不然试试介绍个
.convertBodyTo(String.class)前解组 -
@TacheDeChoco 不,它没有默认构造函数,我使用的是 Kotlin 数据类
-
您的 pojo 需要遵守 Java Bean 约定(例如使用默认构造函数),否则解组无法工作
-
还要检查您的 pojo 是否带有
@XmlRootElement注释
标签: kotlin apache-camel spring-camel