Jackson MessageSerializer冻结但应用程序不会崩溃

时间:2014-12-14 22:30:50

标签: java json spring serialization

我正在使用Spring和Hibernate构建Restful Web应用程序。对于序列化我使用Jackson库(版本2.x)。

我面临的问题如下:我有一个用户,项目和评级,它们看起来如下:

public class Item {
    ...
    @OneToMany(targetEntity = Rating.class, mappedBy = "rating", orphanRemoval = true)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Set<Rating> rating = new HashSet<>();
    ...
}

public class Rating {
    ...
    @ManyToOne(targetEntity = User.class, optional = false)
    @JoinColumn(name="user_id")
    @JsonIdentityReference(alwaysAsId = true)
    private User user;

    @ManyToOne(targetEntity = Item.class, optional = false)
    @JoinColumn(name="item_id")
    @JsonIdentityReference(alwaysAsId = true)
    private Item item;
    ...
}


public class User {
    ...
    @OneToMany(targetEntity = Rating.class, mappedBy = "user", fetch = FetchType.LAZY, orphanRemoval = true)
    @JsonIdentityReference(alwaysAsId = true)
    @Cascade(CascadeType.SAVE_UPDATE)
    private List<Rating> ratings  = new ArrayList<Rating>();
    ...
}

现在,如果我尝试为特定用户保存项目的新评级,请使用执行以下操作的方法:

if(formerVoting != null) { //Previously fetched from the DB
    item.removeUserRating(formerVoting);
}
Rating newRating = new Rating(); //Create new Rating
newRating.setRating(rating);
newRating.setItem(item);
newRating.setUser(user);
user.addRating(newRating);
stop.addRating(newRating);
userDao.update(user);
stopDao.update(stop);
return stop;

这一点也有效,但是当杰克逊试图序列化我从我的控制器返回的ResponseEntity时,它就会冻结。

我确认mehtod返回并调整了级联但没有任何帮助。有谁知道我做错了什么?

BR, wastl

修改

我终于弄清楚问题是什么:

我为项目字段使用了自定义序列化程序,它引发了异常。显然杰克逊没有妥善处理这个异常,服务器只是没有返回任何东西。

1 个答案:

答案 0 :(得分:0)

UserRating之间存在双向关系。 Hibernate通常可以优雅地处理循环引用,但Jackson需要一些工作(实际上,只要你将对象图强制转换为树结构,这就是一个潜在的问题)。你必须决定如何序列化你的对象;如果User是顶级对象(JSON树的根目录),那么您需要告诉Jackson忽略user中的Rating字段。否则,它将陷入无限递归。

@Cascade注释与杰克逊无关,所以暂时不要忘记。