gpt4 book ai didi

rest - Camel 调用休息服务无法检索返回对象 dto : JsonMappingException, CachedOutputStream 没有序列化程序

转载 作者:行者123 更新时间:2023-12-04 10:58:59 24 4
gpt4 key购买 nike

我有一个包含两个模块的 Maven 多模块项目:

  • 运行休息服务的 springboot(在端口 8081 上)
  • 充当代理并调用其余服务(端口 8080)的 Camel 项目

在 Camel 项目中,我创建了一个这样的路线构建器:

restConfiguration().component("servlet")
.bindingMode(RestBindingMode.json)
.dataFormatProperty("prettyPrint", "true")
.dataFormatProperty("json.in.disableFeatures", "FAIL_ON_EMPTY_BEANS")
.contextPath("/").port(8080)
.apiProperty("cors", "true");

rest("/car").description("Cars rest service")
.consumes("application/json").produces("application/json")
.get("/{id}").description("Find car by id")
.param().name("id").type(RestParamType.path)
.description("The id of the car to get")
.dataType("int").endParam()
.to("http://localhost:8081?bridgeEndpoint=true");

其余服务返回 ResponseEntity<CarDto>有效且不为空(我已调试),但 Camel 项目无法获取它,启动异常:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS). at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:275) at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110) at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292) at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1419) at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1147) at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:977) at org.apache.camel.component.jackson.JacksonDataFormat.marshal(JacksonDataFormat.java:154)

然后,我没有调用 rest 服务,而是添加了一个具有相同请求映射的 controller-api:

@RequestMapping(value = "/car/{id}", method = RequestMethod.GET)
public ResponseEntity<CarDto> findOne...

在返回 CarDto 的 Camel 项目中也。 Camel 调用它并且工作正常。

有人可以帮忙吗?

最佳答案

camel 中定义的 REST 端点使用 GET 方法,该方法生成一个空主体的消息。这与 Spring Controller 的不同之处在于, Controller 检索 CarDTO 实例,这是 Camel route 缺少的。

暴露的rest端点接收到请求后,它应该转换成另一种类型,所以你的最终端点消费JSON,应该插入以下转换步骤

.marshal().json(JsonLibrary.Jackson, CarDTO.class)

我想补充的最后一点是,由于消费者和生产者都处理由 camel-http 组件定义的相同 header ,如果消费端点返回 header ,这似乎很容易出错当提交到生成的端点时会产生影响。当将使用的 HTTP 消息转发到生成的 HTTP 消息时,应考虑到这一点。

关于rest - Camel 调用休息服务无法检索返回对象 dto : JsonMappingException, CachedOutputStream 没有序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40463199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com