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

时间:2016-11-07 10:41:38

标签: rest apache-camel

我有一个带有两个模块的maven多模块项目:

  • 运行休息服务的springboot(在端口8081上)
  • 扮演代理并调用其余服务(端口8080)的驼峰项目

在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:没有为类org.apache.camel.converter.stream.CachedOutputStream $ WrappedInputStream找到序列化程序,也没有发现创建BeanSerializer的属性(为了避免异常,请禁用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)   在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)   在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)   在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。骆驼称它并且工作正常。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

camel中定义的REST端点使用GET方法生成一个空主体的消息。这与Spring控制器的不同之处在于控制器检索CarlTO实例,该实例在驼峰路径中缺失。

在暴露的休息端点收到请求后,它应该转换为另一种类型,因此您的最终端点使用JSON,应插入以下转换步骤

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

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