java - Jackson annotations not used with Spring boot -
i using spring boot 1.0.1.release , trying pick jackson annotations. more specifically, trying use @jsonmanagedreference
, @jsonbackreference
annotations. idea why might ignored? tried @jsonignore
did not seem picked up.
i tried 2 things mentioned in question (moving jackson annotionations first , using list
instead of set
). looked @ this question on spring forums, not me either.
update:
this componenttype
class:
@entity public class componenttype { // ------------------------------ fields ------------------------------ @id @generatedvalue() private long m_id; private string m_name; @jsonmanagedreference @onetomany(cascade = cascadetype.all) @joincolumn(name = "parent_id") private list<componentsubtype> m_subtypes; // --------------------------- constructors --------------------------- public componenttype() { } public componenttype( string name, iterable<componentsubtype> subtypes ) { m_name = name; m_subtypes = lists.newarraylist(subtypes); } // -------------------------- public methods -------------------------- public long getid() { return m_id; } public void setid( long id ) { m_id = id; } public string getname() { return m_name; } public void setname( string name ) { m_name = name; } public list<componentsubtype> getsubtypes() { return m_subtypes; } public void setsubtypes( list<componentsubtype> subtypes ) { m_subtypes = subtypes; } public componentsubtype getsubtype( final long subtypeid ) { return iterables.find( getsubtypes(), new predicate<componentsubtype>() { @override public boolean apply( componentsubtype input ) { return input.getid() == subtypeid; } } ); }
and componentsubtype
:
@entity public class componentsubtype { @id @generatedvalue() private long m_id; private string m_name; @jsonbackreference @manytoone(fetch = fetchtype.lazy) @joincolumn(name = "parent_id",insertable=false,updatable=false) private componenttype m_componenttype; public componentsubtype() { } public componentsubtype( string name ) { m_name = name; } public long getid() { return m_id; } public void setid( long id ) { m_id = id; } public string getname() { return m_name; } public void setname( string name ) { m_name = name; } public componenttype getcomponenttype() { return m_componenttype; } public void setcomponenttype( componenttype componenttype ) { m_componenttype = componenttype; } }
the controller:
@restcontroller @requestmapping("/api/components") public class componenttypecontroller { @autowired private componenttyperepository m_repository; @requestmapping("/list") public iterable<componenttype> listcomponents() { return m_repository.findall(); } }
and repository:
public interface componenttyperepository extends crudrepository<componenttype, long> { }
in main create entities testing:
configurableapplicationcontext context = springapplication.run( main.class, args ); componenttyperepository componenttyperepository = context.getbean( componenttyperepository.class ); componenttyperepository.save( new componenttype( "component a", sets.newhashset( new componentsubtype( "sub - 1" ), new componentsubtype( "sub - 2" ) ) ) ); componenttyperepository.save( new componenttype( "component b", sets.newhashset( new componentsubtype( "sub b - 1" ), new componentsubtype( "sub b - 2" ) ) ) ); componenttyperepository.save( new componenttype( "component c", sets.newhashset( new componentsubtype( "sub c - 1" ), new componentsubtype( "sub c - 2" ) ) ) ); componenttyperepository.save( new componenttype( "component d", sets.newhashset( new componentsubtype( "sub d - 1" ), new componentsubtype( "sub d - 2" ), new componentsubtype( "sub d - 3" ) ) ) );
if point browser http://localhost:8080/api/components/list
, stackoverflow exception.
this part of stacktrace get:
java.lang.stackoverflowerror: null @ java.lang.classloader.defineclass1(native method) @ java.lang.classloader.defineclass(classloader.java:800) @ java.security.secureclassloader.defineclass(secureclassloader.java:142) @ java.net.urlclassloader.defineclass(urlclassloader.java:449) @ java.net.urlclassloader.access$100(urlclassloader.java:71) @ java.net.urlclassloader$1.run(urlclassloader.java:361) @ java.net.urlclassloader$1.run(urlclassloader.java:355) @ java.security.accesscontroller.doprivileged(native method) @ java.net.urlclassloader.findclass(urlclassloader.java:354) @ java.lang.classloader.loadclass(classloader.java:425) @ sun.misc.launcher$appclassloader.loadclass(launcher.java:308) @ java.lang.classloader.loadclass(classloader.java:358) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:660) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) @ com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:183) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:541) @ com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:644) @ com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:152) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:117) @ com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23)
example project demonstrates problem:
download https://dl.dropboxusercontent.com/u/6373261/jackson-problem.zip
it's (old-fashioned imo) naming convention fields ("m_*"). jackson doesn't correlate them getters , setters. have either @jsonignore
getters , setters, or change naming, or annotate getters. or maybe there feature in @jsonbackreference(...)
? @jsonbackreference("componenttype")
instance, might work.
Comments
Post a Comment