2016-11-07 65 views
2

我有一個Maven多模塊項目有兩個模塊:駱駝調用REST服務無法檢索返回對象DTO:JsonMappingException,無串爲CachedOutputStream

  • 運行REST服務(端口8081)
  • 一個一個springboot

在駱駝項目中,我創建了一個路線建設者這樣的駱駝項目誰充當代理並調用其他服務(端口8080):

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"); 

REST服務返回ResponseEntity<CarDto>有效並且不爲空(我調試的話),但儘管如此,駱駝項目不能得到它,一個異常被推出:

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) 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.ObjectWrite r._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)

然後,而不是調用其他服務,我增加了一個控制器-API與同requestmapping:

@RequestMapping(value = "/car/{id}", method = RequestMethod.GET) 
public ResponseEntity<CarDto> findOne... 
在它返回一個 CarDto太駱駝項目

。駱駝稱它並且工作正常。

任何人都可以幫忙嗎?

回答

0

camel中定義的REST端點使用GET方法生成帶空體的消息。這與Spring控制器的不同之處在於,控制器檢索駱駝路由中缺少的CarDTO實例。

暴露REST端點接收到請求後,要轉變成另一種類型,所以你最終的終點消耗JSON,下面的轉換步驟應插入

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

的最後一點,我想補充是由於消費者和生產者處理由camel-http組件定義的相同頭文件這一事實,如果消費端點返回一個頭部,並在提交給生成的端點時產生效果,那麼這似乎很容易出錯。當消費的HTTP消息被轉發到生成的HTTP消息時,應該考慮到這一點。