我正在使用 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 或者自定义杰克逊以让它这样做的正确方法是什么?
谢谢