java - Hibernate 一对多到 JSON 给出 : 500 internal server error

标签 java json hibernate rest jersey

我有 2 个 POJO。

配置文件类,其中包含:id、名称、消息(消息列表),与一对多关系映射。

消息类:id、消息、配置文件(与 ManyToOne 映射)

配置文件类

@XmlRootElement
@Entity
@Table(name="Profile")
public class Profile {
    @Id
    @GeneratedValue
    @Column(name="profile_id")
    private int id;
    private String name;
    @OneToMany(mappedBy="profile")
    private List<Message> messages = new ArrayList<Message>();

消息类

@XmlRootElement
@Entity
@Table(name="Message")
public class Message {
    @Id
    @GeneratedValue
    private int id;
    private String message;
    @ManyToOne
    @JoinColumn(name="profile_id")
    private Profile profile;

发帖方法

@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Profile test(){

    Profile profile = new Profile(1,"John");

    Message message = new Message("Hello World!");

    Session session = sessionFactory.openSession();
    session.beginTransaction();

    profile.getMessages().add(message);
    session.save(profile);

    message.setProfile(profile);
    session.save(message);

    session.getTransaction().commit();
    session.close();

    return profile;
}

当我在 Chrome 中通过 Postman 发出请求时,收到“500 内部服务器错误”。

奇怪的部分是它在我的数据库中插入。它做得正确(它使用外键将消息映射到配置文件),但似乎无法以 Json 形式返回响应。

如果我不保存消息(使用 session.save(message),它确实会返回正确的响应,但不再映射它。

如何使用一对多关系获得 Json 响应?

最佳答案

我发现这些 500 服务器错误通常是由 JSON 编码过程中的电路引起的。

例如,Jersey 开始将您的 Profile 对象编码为 JSON。它执行 id、name,然后开始编码 messages 属性。

它从数组中取出第一个 Message 对象并开始对其进行编码。第一个 Message 对象有一个 id、名称和一个对 Profile 对象的引用。此时,它跟随 Profile 对象并开始再次对其进行编码。

你可以看到你已经进入了一个未终止的递归过程。最终停止递归编码的是当堆栈耗尽自身时您遇到的 500 服务器错误。

要阻止这种情况,您可以对对象进行自定义编码,也可以简单地将 @JsonIgnore 属性放在 Message 类中的配置文件属性上。

如果您发现需要更多控制,请查找 com.fasterxml.jackson.databind.JsonSerializer。

关于java - Hibernate 一对多到 JSON 给出 : 500 internal server error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459157/

相关文章:

java - 获取通用类型 T 的 declaredFields

java - EclipseLink 不使用嵌套的 Lazy OneToMany 关系填充 Lazy OneToOne

java - MongoDB嵌入数组属性平均值(使用Java和MongoJack)

php - Ajax post 请求安全

java - 警告 : java. lang.IndexOutOfBoundsException

java - hibernate中的注释是hibernate还是java持久化API?

java - Android 内存不足错误

java - 使用 Jackson 输入流会将所有内容带入内存

python - 尝试使用 Python 打印 JSON 数据

java - 在基于 Spring MVC 的应用程序中,我应该何时何地从 hibernate 4.3.8.Final 获取新 session ?