jackson - Different JSON output when using custom json serializer in Spring Data Rest -
after adding custom jackson
serializer based on official documenation i've observed different json output format.
this example based on fork of spring-restbucks.
extend org.springsource.restbucks.webconfiguration
repositoryrestmvcconfiguration
, override configurejacksonobjectmapper
:
@override protected void configurejacksonobjectmapper(objectmapper objectmapper) { final simpleserializers serializers = new simpleserializers(); serializers.addserializer(order.class, new orderserializer()); objectmapper.registermodule(new simplemodule("customserializermodule"){ @override public void setupmodule(setupcontext context) { context.addserializers(serializers); } }); }
create class org.springsource.restbucks.order.orderserializer
. sake of brevity write attribute paid
json.
public class orderserializer extends jsonserializer<order> { @override public void serialize(order value, jsongenerator jgen, serializerprovider provider) throws ioexception { jgen.writestartobject(); jgen.writebooleanfield("paid", value.ispaid()); jgen.writeendobject(); } }
before adding orderserializer json response http://localhost:8080/orders/1
looks like:
{ "location": "take_away", "status": "payment_expected", "ordereddate": "2014-03-24t15:05:09.988+01:00", "items": [ { "name": "java chip", "quantity": 1, "milk": "semi", "size": "large", "price": { "currency": "eur", "value": 4.2 } } ], "_links": { ... } }
after adding orderserializer json response http://localhost:8080/orders/1
looks like
{ "content": { "paid": false }, "_links": { ... } }
the main pinpoint attribute paid wrapped object content attribute of org.springframework.hateoas.resource. i've expected response without attribute:
{ "paid": false, "_links": { ... } }
i've looked jackson code , found unwrappingbeanserializer might solution i'm looking for. after looking @ how initialize unwrappingbeanserializer think serializer not meant subclassed custom use.
i know whether deviating json format when using custom serializer normal behaviour or bug in spring data rest. kind of appreciated.
this not bug of spring data rest normal behaviour of jackson serializer. whenever use @jsonunwrapped annotation (as resource content field does) custom serializer jackson serializer explicitly write field name (in case content). have @ unwrappingbeanpropertywriter more details. anyhow have been on right track using unwrappingbeanserializer setup different usual serializer registration. following example should fix problem:
@override protected void configurejacksonobjectmapper(objectmapper objectmapper) { mapper.registermodule(new module() { @override public string getmodulename() { return "my.module"; } @override public version version() { return version.unknownversion(); } @override public void setupmodule(setupcontext context) { context.addbeanserializermodifier(new beanserializermodifier() { @override public jsonserializer<?> modifyserializer(serializationconfig config, beandescription beandesc, jsonserializer<?> serializer) { if(beandesc.getbeanclass().equals(order.class)) { return new unwrappingorderserializer((beanserializerbase) serializer, nametransformer.nop); } return serializer; } }); } }); } public class unwrappingorderserializer extends unwrappingbeanserializer { public unwrappingbarserializer(beanserializerbase src, nametransformer transformer) { super(src, transformer); } @override public jsonserializer<object> unwrappingserializer(nametransformer transformer) { return new unwrappingorderserializer(this, transformer); } @override protected void serializefields(object bean, jsongenerator jgen, serializerprovider provider) throws ioexception, jsongenerationexception { order order = (order) bean; jgen.writestringfield("paid", order.ispaid(); } @override public boolean isunwrappingserializer() { return true; } }
Comments
Post a Comment