I'm using Apache Camel to build a REST POST endpoint that takes and object and returns another object as 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");
the MyProcessor.java
class makes all the logic to use the RqObj
object and build the RsObj
response.
That works and I see the JSON response, but there is a problem, the RsObj
contains dates as XMLGregorianCalendar
with a specific timezone (and I cannot edit the definition of RsObj.java
, because it's coming from an external dependency), so even if I set a date field to 2021-05-12T10:00:00.000+0000
at the end the returned JSON shows something else: 2021-05-12T08:00:00.000+0000
(different hour).
So I would like either to edit that field somehow during the serialization / deserialization process, or just customizing Jackson so that it uses a specific date format.
For instance, I made some attempts to tell Camel to use a customized ObjectMapper
(as following):
ObjectMapper myObjectMapper = new ObjectMapper().setDateFormat(new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"));
and using it in one of the following ways:
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);
or:
from("direct:toProcessor").
routeId("routeId").
log(">>> ${body}").
process(myProcessor).
marshal(new JacksonDataFormat(myObjectMapper, CheckResponse.class)).
unmarshal(new JacksonDataFormat(myObjectMapper, CheckResponse.class))
but none of those changes the result.
So what would it be your solution here?
Is there a way to tell Camel to adjust the response before returning is as JSON or what's the right way to customize Jackson in order to let it do it?
Thanks