首页 > 解决方案 > 在 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 类型转换失败。

标签: javajsonapache-camelspring-camel

解决方案


推荐阅读