0

我正在使用 Apache Camel 构建一个 REST POST 端点,该端点接受对象并将另一个对象作为 JSON 返回:

from("direct:toProcessor").
        routeId("routeId").
        log(">>> ${body}").
        process(myProcessor);

rest("/api").
        id("route1").
        consumes("application/json").
        post("/test").
        bindingMode(RestBindingMode.json).
        type(RqObj.class).
        outType(RsObj.class).
        to("direct:toProcessor");

该类MyProcessor.java使所有逻辑都使用该RqObj对象并构建RsObj响应。

这有效,我看到了 JSON 响应,但是有一个问题,RsObj包含XMLGregorianCalendar特定时区的日期(我无法编辑 的定义RsObj.java,因为它来自外部依赖项),所以即使我将日期字段设置为2021-05-12T10:00:00.000+0000最后返回的 JSON 显示其他内容:(2021-05-12T08:00:00.000+0000不同的时间)。

所以我想在序列化/反序列化过程中以某种方式编辑该字段,或者只是自定义杰克逊,以便它使用特定的日期格式。

例如,我尝试告诉 Camel 使用自定义ObjectMapper(如下):

ObjectMapper myObjectMapper = new ObjectMapper().setDateFormat(new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"));

并以下列方式之一使用它:

JacksonDataFormat jacksonDataFormat = new JacksonDataFormat(myObjectMapper, null);
final DataFormatDefinition dataFormatDefinition = new JsonDataFormat();
dataFormatDefinition.setDataFormat(jacksonDataFormat);
final Map<String, DataFormatDefinition> map = new HashMap<>();
map.put("json", dataFormatDefinition);
getContext().
        setDataFormats(map);

或者:

from("direct:toProcessor").
        routeId("routeId").
        log(">>> ${body}").
        process(myProcessor).
        marshal(new JacksonDataFormat(myObjectMapper, CheckResponse.class)).
        unmarshal(new JacksonDataFormat(myObjectMapper, CheckResponse.class))

但这些都不会改变结果。

那么你的解决方案是什么?

有没有办法告诉骆驼在返回之前调整响应是 JSON 或者自定义杰克逊以让它这样做的正确方法是什么?

谢谢

4

1 回答 1

0

根据您的输入,我可以看到,外部实体正在进行某种处理。

如果日期时区是您的问题,可能请尝试将日期转换为 UTC,然后再将其设置到对象中。

但是如果你想让 objectMapper 为你做一些特殊的工作,那么你可以定义一个自定义对象映射器

自定义 JSON 序列化器

于 2021-03-31T10:22:01.253 回答