POSTS

Jackson - BeanSerializer.serialize and ContainerSerializers$CollectionSerializer.serialize error

In a Spring + Hibernate + Jackson project while calling:

http://localhost:8080/SpringMVC/getAllBookmark

(…)

@RequestMapping(value=“/getAllBookmark”, method = RequestMethod.GET)

public @ResponseBody List getAllBookmarkJSON() {

List list = this.bookmarkDAO.getAllBookmark();

return list;

}

(…)

, was getting the following error:

at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:122)

at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serialize(ContainerSerializers.java:151)

at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serialize(ContainerSerializers.java:117)

at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:218)

The problem was related to a cyclic reference (click here for more information) in a relation type “many-to-one” between Bookmark and Image:

(…)

public class Bookmark implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;

private String metaTitle;

private String sourceCode;

private String url;

private Set bookmarkImages = new HashSet();

(…)

(…)

        

       

(…)

(…)

public class Image implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;

private String url;

private Bookmark bookmark;

(…)

(…)

           

(…)

Has you may notice we have that Bookmark has many Images and a Image has a Bookmark.

The solution has then to warn Jackson not to serialise Bookmark Image instance variable(because Bookmark would have again a set of Images…) by annotate it with “@JsonIgnore”.

(…)

public class Image implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;
private String url;
@JsonIgnore
private Bookmark bookmark;

(…)

@JsonIgnore
public Bookmark getBookmark() {

return bookmark;

}

(…)