我遵循以下Apache骆驼休息服务(/ sales),该服务在内部调用另一个休息服务(/ getOrders)并获取对象列表。能够在处理器中打印JSON响应,但是在尝试从邮递员那里获取Java对象作为响应。任何人都可以帮助我解决问题。附加参考的响应日志。
@Component
public class ApplicationResource extends RouteBuilder {
@Autowired
private OrderService service;
@BeanInject
private OrderProcessor processor;
@Override
public void configure() throws Exception {
restConfiguration().component("servlet").port(9090).host("localhost");
rest().get("/getOrders").produces(MediaType.APPLICATION_JSON_VALUE).route().setBody(() -> service.getOrders());
rest().get("/sales").produces(MediaType.APPLICATION_JSON_VALUE).route()
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.toD("http://localhost:9090/getOrders?bridgeEndpoint=true").convertBodyTo(String.class).marshal()
.json(JsonLibrary.Jackson, Order.class).to("log:foo?showHeaders=true");;
;
}
}
答案 0 :(得分:0)
您应该删除“ direct:bye”路由上的最后一个.endRest()。 我认为您可以在致电处理器之前得到其余的响应。
答案 1 :(得分:0)
这对我有用。
首先,我需要在bindingMode
中将RestBindingMode.json
设置为restConfiguration
。
其次,您需要使用marshal()
而不是unmarshal()
。
第三,由于您要返回订单列表,因此.json(JsonLibrary.Jackson, Order.class)
不足以解组订单列表。您需要使用一种自定义格式,该格式将能够将订单列表解组到json数组中。您需要使用JacksonDataFormat format = new ListJacksonDataFormat(Order.class);
@Override
public void configure() {
JacksonDataFormat format = new ListJacksonDataFormat(Order.class);
restConfiguration().component("servlet").port(9090).host(localhost).bindingMode(RestBindingMode.json);
rest()
.get("/getOrders")
.produces(MediaType.APPLICATION_JSON_VALUE)
.route()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getMessage().setBody(service.getOrders());
}})
.to("log:getOrders?showHeaders=true&showBody=true");
rest()
.get("/sales")
.produces(MediaType.APPLICATION_JSON_VALUE)
.route()
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.toD("http://localhost:9090/getOrders?bridgeEndpoint=true")
.unmarshal(format)
.to("log:sales?showHeaders=true&showBody=true");
}
答案 2 :(得分:0)
Solvedddd !!! i did two things as follows,May be use full for some one
1,bindingMode(RestBindingMode.auto)-RestBindingMode更改为auto
来自json
2,在主添加
service(/ getOrders).marshal()。json(JsonLibrary.Jackson);
@Component
public class ApplicationResource extends RouteBuilder {
@Autowired
private OrderService service;
@BeanInject
private OrderProcessor processor;
@Override
public void configure() throws Exception {
restConfiguration().component("servlet").port(9090).host("localhost").bindingMode(RestBindingMode.auto);
rest().get("/getOrders").produces(MediaType.APPLICATION_JSON_VALUE).route().setBody(() -> service.getOrders())
.marshal().json(JsonLibrary.Jackson);
rest().get("/sales").produces(MediaType.APPLICATION_JSON_VALUE).route()
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.toD("http://localhost:9090/getOrders?bridgeEndpoint=true").convertBodyTo(String.class)
.log("body = ${body}");
;
;
}
}