我有一个带有两个模块的maven多模块项目:
在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
。骆驼称它并且工作正常。
有人可以帮忙吗?
答案 0 :(得分:0)
camel中定义的REST端点使用GET方法生成一个空主体的消息。这与Spring控制器的不同之处在于控制器检索CarlTO实例,该实例在驼峰路径中缺失。
在暴露的休息端点收到请求后,它应该转换为另一种类型,因此您的最终端点使用JSON,应插入以下转换步骤
.marshal().json(JsonLibrary.Jackson, CarDTO.class)
我想补充的最后一点是,由于消费者和生产者都处理由camel-http组件定义的相同标头,如果消费的端点返回标头,这似乎非常容易出错。这会在提交到生成的端点时产生影响。当消费的HTTP消息被转发到生成的HTTP消息时,应该考虑这一点。