java - 在 Apache Camel 中对 Rest 消费者执行类型转换
问题描述
我正在寻找一种简单的方法来做一些在 Spring 中很简单的事情:解组编组 API 对象。
在春天:
@RestController
...
...
@PostMapping
public Response someMethod(@RequestBody Request request) {...
在 Camel 中,我通过 Camel Rest generator maven 插件生成了一个 Rest route dsl,我有:
.post("/resource")
.id("createResource")
.param()
.name("resource")
.type(RestParamType.body)
.required(true)
.endParam()
.to("direct:createResource")
// And then
from("direct:createResource").inputType(Request.class).outputType(Response.class).process(....any processing...)
数小时的尝试:没有办法让 Camel 反序列化和序列化这些对象。
如果我什么都不做:
java.lang.IllegalArgumentException: No Transformer found for [from='json', to='java:it.example.Request']
如果我通过 restConfiguration 配置休息:
restConfiguration().bindingMode(RestBindingMode.json);
org.apache.camel.InvalidPayloadException:没有可用的类型:it.example.Request 但有值:{id=bbb} 类型:java.util.LinkedHashMap on:HttpMessage@0x6e3612d5。原因:没有类型转换器可用于将类型:java.util.LinkedHashMap 转换为所需的类型:it.example.Request,值为 {id=bbb}。交换[3673959DC24081F-0000000000000000]。原因:[org.apache.camel.NoTypeConversionAvailableException - 没有类型转换器可用于从类型:java.util.LinkedHashMap 转换为所需类型:it.example.Request,值为 {id=bbb}]
没有类型转换器?从json到pojo,从pojo到json,如何让Camel简单的使用Jackson?
依赖关系,Camel 是 3.8.0 和 Spring Boot 2.4.3:
// Spring Boot
implementation 'org.springframework.boot:spring-boot-starter-web'
// Apache Camel
implementation "org.apache.camel.springboot:camel-spring-boot-starter:$camelVersion"
implementation "org.apache.camel.springboot:camel-rest-starter:$camelVersion"
implementation "org.apache.camel.springboot:camel-jackson-starter:$camelVersion"
implementation "org.apache.camel.springboot:camel-servlet-starter:$camelVersion"
implementation "org.apache.camel.springboot:camel-direct-starter:$camelVersion"
另外,如何处理异常?我需要序列化众所周知的对象中的异常,而不是输出堆栈跟踪。同样,这在 Spring 中使用 ResponseEntity 类非常简单。
注意:这个问题是关于如何从 REST DSL而不是 ROUTE DSL 反序列化。“类型”构建器方法来自 RestDefinition 而不是 RouteDefinition。要重现该问题,只需使用 swagger camel dsl 插件自动生成一个 Rest 定义,然后尝试在 json 中反序列化:这是不可能的。原因是:路由 dsl 中的类型定义“为时已晚”输入已在通用 LinkedHashMap 中转换,并且 json/pojo 类型转换失败。
解决方案
推荐阅读
- google-app-engine - 每个 F1 实例的 App Engine 兆周期/秒
- javascript - 为什么在chrome上出现上传错误,而不是firefox?
- java - Java Jackson 序列化器,包括 FQCN
- sql - SQL dbms_output.put_line 格式化
- r - 在 r 中使用 optim 最大化函数,其中参数之一是整数
- python - 使用 URL 中的变量循环抓取网站中多个页面的数据
- javascript - 当我尝试在同一页面上创建两个滑块框时,它不起作用
- c++ - 使用模板进行堆栈实现;“名称后跟 :: 必须是类或命名空间”
- vb.net - 为什么我的 VB 程序抛出异常,抱怨 OleDbDataReader 已关闭,而它应该绝对打开?
- windows - 为什么我在任务计划程序中看不到我的任务