【问题标题】:Apache camel dynamic routingApache骆驼动态路由
【发布时间】:2020-05-13 06:03:34
【问题描述】:

我关注 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");;
        ;

    }

}

【问题讨论】:

  • 你能在你的路由中添加一些日志吗?这将有助于调试。
  • 请找到完整的 RouteBuilder 类

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


【解决方案1】:

您应该删除“direct:bye”路由上的最后一个 .endRest()。 我想你在调用你的处理器之前得到了其余的响应。

【讨论】:

  • 正如我在问题中指定的那样,我正在从骆驼交换对象获取处理器中的响应,但在尝试从邮递员和空标签时没有得到 json 响应
  • .endRest() 并不意味着交换结束。这意味着您的休息通话结束。
  • 删除了相同但仍然没有得到 json 响应
  • 你能在 .endRest() 之前添加 .to("log:foo?showHeaders=true");并打印正文和标题。
  • 谢谢.. 在我删除 ."bindingMode(RestBindingMode.json)" 后,响应现在来自 post man,但它以 java 对象列表而不是 json 的形式出现。我已经修改了问题并附上了你所说的休息图像作为参考
【解决方案2】:

这对我有用。

首先,我需要将restConfiguration中的bindingMode设置为RestBindingMode.json

其次,您需要使用unmarshal(),而不是marshal()

第三,由于您要返回订单列表,.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");
    }

【讨论】:

    【解决方案3】:
    Solvedddd !!! i did two things as follows,May be use full for some one
    

    1,bindingMode(RestBindingMode.auto) - RestBindingMode 更改为 auto 来自 json
    2,在main中添加了这个 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}");
            ;
            ;
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      相关资源
      最近更新 更多