In order to handle the configuration we built a wrapper around the object
mapper that handles it all during construction:
public class XxxObjectMapper extends ObjectMapper
{
public XxxObjectMapper()
{
super();
configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
SimpleModule module = new SimpleModule("xxx-module", new Version(2,
0, 0, "RELEASE"));
module.addSerializer(XxxDateSerializer.instance);
registerModule(module);
}
}
We are exchanging JSON data with android devices so we are using Jackson on
both ends. We had to implement a custom serializer
as a workaround for a problem we were having on the device side as well so
we just use the same ObjectMapper on both ends:
/**
* Custom das date serializer that uses JODA time to get around a bug in
SimpleDateFormat
* in Harmony:
*
* http://code.google.com/p/android/issues/detail?id=8258
*
* @author Charles Hudak
* @since Feb 16, 2011
*
*/
public class XxxDateSerializer extends ScalarSerializerBase<java.util.Date>
{
public final static XxxDateSerializer instance = new
XxxDateSerializer();
public XxxDateSerializer() { super(java.util.Date.class); }
@Override
public void serialize(java.util.Date value, JsonGenerator jgen,
SerializerProvider provider)
throws IOException, JsonGenerationException
{
DateTimeFormatter dtf =
ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
jgen.writeString(dtf.print(new DateTime(value)));
}
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
throws JsonMappingException
{
return createSchemaNode("string", true);
}
}
For what it is worth, I found that while I can't use the <dataFormats>
configuration element to automatically wire up all my json configurations,
I can do it this way:
Data Format configuration:
<!-- Custom dataformat for json -->
<bean id="purchaseRequestDataFormat"
class="org.apache.camel.component.jackson.JacksonDataFormat">
<constructor-arg ref="jsonObjectMapper"/><!-- Our custom object
mapper -->
<constructor-arg value="com.xxx.common.json.model.PurchaseRequest"/>
</bean>
In my route:
<!-- convert from json to object -->
<camel:unmarshal ref="purchaseRequestDataFormat"/>
On Thu, Dec 8, 2011 at 11:27 PM, Claus Ibsen <[email protected]> wrote:
> Hi
>
> Do you mind posting how you configure Jackson currently to fx marshal
> dates as you do etc.
>
> We may need to add some configuration options to the Jackson JSON data
> format, so you can configure this as well easily.
>
>
> On Fri, Dec 9, 2011 at 3:29 AM, Charles Hudak <[email protected]>
> wrote:
> > Hi,
> >
> > I'm new to Camel and am setting up some routes to do some JSON
> marshalling
> > and unmarshalling. We use Jackson and have been doing this with spring
> > integration and spring mvc for building RESTful web applications that
> > consume and produce JSON.
> >
> > We use a custom configuration of the Jackson object mapper that marshals
> > dates as ISO-8601 strings (among other things) rather than ms. I can't
> seem
> > to find anyway to get camel to use my ObjectMapper; there doesn't appear
> to
> > be any injection point when the DataFormat is configured. Is this
> possible?
> > I'm using xml configuration not java DSL.
> >
> > Thanks,
> >
> > Charles
>
>
>
> --
> Claus Ibsen
> -----------------
> FuseSource
> Email: [email protected]
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
>