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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -