Apache骆驼动态路由

时间:2020-05-13 06:03:34

标签: spring spring-boot rest apache-camel camel-rest

我遵循以下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");;
        ;

    }

}

enter image description here

3 个答案:

答案 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}");
        ;
        ;

    }

}