当前位置: 首页 > 知识库问答 >
问题:

如何在AggregationStrategy中将消息正文转换为pojo

汪正雅
2023-03-14

我有一条路由(Camel 2.17.3),它使用丰富的 DSL 调用Rest服务并将结果聚合到消息正文中。不过,我遇到了序列化问题。这是我正在尝试的。我的路线如下所示:

rest("myService").produces("application/json")
            .get("test")
            .param().name("text").required(true).type(RestParamType.query).description("The text to be processed.").endParam()
                .to("direct:StepA")
    ;

    from("direct:StepA")
            .removeHeader("CamelHttpQuery")
            .removeHeader("CamelHttpRawQuery")
            .enrich("netty4-http://myOtherService:8080/endpoint?input=${header.text}", new MyAggregator())
            .to("direct:StepB")
    ;

    from("direct:StepB")
            // not really implemented yet
            .transform().simple("Query: ${header.text}\nBody: ${body}")
    ;

正如您所看到的,我想使用enrich()DSL调用一些现有服务,并将这些结果聚合起来,形成一个新的消息体,以便进一步处理。我需要将rest调用的结果从Json转换为MyResponse。我想用这个:

.unmarshal().json(JsonLibrary.Jackson, MyResponse.class)

但我需要它已经在我的AggregationStrategy中解组,如下所示:

public class MyAggregator implements AggregationStrategy {
    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        final MyResponse intermediateResponse = oldExchange.getIn().getBody(MyResponse.class);

        final MyAggregate response = new MyAggregate(oldExchange.getIn().getHeader("text", String.class), intermediateResponse);

        newExchange.getIn().setBody(response);
        return newExchange;
}

然而,当我说getBody(..).所以我学习了TypeConverters,并试着用它来让系统自动转换成我的类型:

public class MyConverter extends TypeConverterSupport {

    private static final ObjectMapper MAPPER =
        new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

    @Override
    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException {
        try {
            return (T)MAPPER.readValue(value.toString(), MyResponse.class);
        } catch (IOException e) {
           throw new TypeConversionException(value, type, e);
        }
}

然后在我的主要:

    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.setApplicationContextUri("classpath:app-ctx.xml");

        for (final CamelContext ctx : main.getCamelContexts()) {
           ctx.getTypeConverterRegistry().addTypeConverter(MyResponse.class, String.class, new MyConverter());
        }

        main.run(args);
    }

但这似乎不会改变结果。在我的聚合器中,MyResponse仍然为空。我不知道如何设置这种类型转换,希望有人能给我指出正确的方向。

共有1个答案

马航
2023-03-14

好的,当我意识到我可以丰富一个执行unmarshall 调用的子路由,然后聚合它时,我最终解决了这个问题......

from("direct:StepA")
        .removeHeader("CamelHttpQuery")
        .removeHeader("CamelHttpRawQuery")
        .enrich("direct:StepAEnricher", new MyAggregator())
        .to("direct:StepB")
;

from("direct:StepAEnricher")
    .toD("netty4-http://myOtherService:8080/endpoint?input=${header.text}")
    .unmarshal().json(JsonLibrary.Jackson, MyResponse.class)
;

这非常有效!我很好奇一个经验丰富的骆驼开发人员会如何看待这一点。使用这种“额外”的路由来处理这样的响应是否代价高昂?我仍然很好奇如何克服自定义类型转换器方法

 类似资料:
  • 我有课 我有一个JSON请求 我有一个REST API 当我调用此API并可视化此student对象时,这两个字段都有我提供的请求中的值。 我不明白的是: JSON值如何直接映射到学生类对象 是否涉及序列化/反序列化 建构师在学生课堂上有什么重要性吗

  • 我有一个这样的endpoint 而IssuePayTokenRequest是这样的 根据Google协议的样式指南,我应该对字段使用蛇形大小写样式,所以当客户端调用这个endpoint时,请求体应该是这样的。 然而,对于JSON样式指南,字段应该使用骆驼案例,像这样 我是否可以进行一些配置,让Spring Boot自动将驼峰式请求正文转换为蛇壳式protobuf消息?

  • 我正在尝试将单个输入消息转换为多个消息。我有一个带有以下签名的方法: 类类似于: 对于中的每个,我想创建一个的实例。我如何做到这一点并处理

  • 在控制台中,我跟踪我所在站点正在拨打的电话,我可以看到地址(some.site.com/gettoken)、消息头和FF称之为消息体的东西。正是在后者中,我可以看到我在正在发送的站点上输入的凭据。 所以,我有URL和消息正文。然后,我尝试像这样使用C#为我的Azure服务层实现行为。 然而,我得到错误400-糟糕的结果。我错过了什么? 我在google上搜索了一些东西,但唯一与之相关的是我使用的上

  • 我想填充Javapojo类与mqtt消息有效载荷在一个Springmvc应用程序。我的代码是: MQTT MessagePayload是{“name”:“abc”,“age”:32},但当它在变量MessagePayload中转换为字符串时,它显示为类似{name:abc,age:32}。你看,去掉所有的双引号。当转到try块时,会抛出一个错误com。fasterxml。杰克逊。果心JsonPar

  • 问题内容: 现在,我通过此行获取File对象: 我需要在base 64中通过json发送此文件。如何将其转换为base64字符串? 问题答案: 现代ES6方式 (异步/等待) UPD: 如果您想捕捉错误