当前位置: 首页 > 知识库问答 >
问题:

Hibernate one to many to JSON给出:500内部服务器错误

丁立果
2023-03-14

我有两个POJO。

一个配置文件类,其id、名称、消息(消息列表)映射为一对多关系。

具有id、message、profile(映射为manytone)的消息类

配置文件类

@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方法

@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(消息),它会返回我正确的响应,但不再映射它。

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

共有2个答案

汪典
2023-03-14

在这个问题上,我花了整整一天的时间挠头。同样的行为,我也无法在控制台上看到任何日志。甚至@jsonIgnoreproperties也帮不了我。

所以我继续,在返回响应之前,我迭代了我的响应对象,并将null值设置为子对象中的父参数。

List<Message> messages=Profile.getMessage();

for (Message msg:messages){
msg.setProfile(null);
}

这对我很有用,因为我不需要子对象中的父对象。

姚煜
2023-03-14

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

例如,泽西开始将您的Profile对象编组为JSON。它执行id、name,然后开始编组消息属性。

它从数组中取出第一个消息对象并开始对其进行编组。第一个消息对象具有id、名称和对概要文件对象的引用。此时,它会跟随Profile对象,并再次开始编组它。

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

要停止此操作,您可以对对象进行自定义编组,也可以简单地在Message类的配置文件属性上放置@JsonIgnore属性。

如果您发现需要更多的控制,请查找com。fasterxml。杰克逊。数据绑定。JsonSerializer。

 类似资料:
  • 我正在为一个web使用flask构建一个api,我已经有了一个数据库,GET请求可以工作,但当我尝试发布时,它会给我这个错误 500内部服务器错误 这是我写的代码 这是我在邮递员上添加的请求 我还使用了一个本地服务器,我查看了其他链接,每个人都在询问日志,如果我没有错,我想我可以从 看法 这是日志的截图:(我想) 到底是什么问题我不明白 编辑:这是完整的代码: 第二次编辑:控制台日志 添加def错

  • 问题内容: 我正在尝试为这个工作中的项目学习AJAX。我有一个网站加载病人正在服用的药物。 我递归调用此AJAX函数,以便它将附加一个包含单种药物和7天历史记录的新表。我在使代码在FF和IE中执行时遇到问题。在chrome中效果很好。我有显示xmlhttp.status的警报,这是我得到的: xmlhttp.status == 500(内部服务器错误)。 我注释掉了所有递归,因此将其范围缩小到了这

  • 我收到以下错误 内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。 请联系服务器管理员,webmaster@strivemedicare.in并告知他们错误发生的时间,以及可能导致错误的任何行为。 有关此错误的详细信息,请参阅服务器错误日志。 此外,尝试使用错误文档处理请求时遇到 500 内部服务器错误错误。

  • 我一直试图在nginx上安装CakePHP,但我遇到了一个死胡同。尝试访问web根目录时,我收到一个500内部服务器错误。我在我的错误中得到了这个错误。日志: PHP消息:PHP致命错误:require():无法打开required'/var/www/html/test/vendor/autoload。php'(include_path='。:/usr/share/php:/usr/share/p

  • 我想用ajax向laravel中的控制器发送post请求。ajax请求发送两个输入参数,我希望controller在数据库中找到包含第一个参数的列,然后使用第二个输入参数设置name属性。但是我在控制台500中有这个错误消息(内部服务器错误)。 Ajax功能: 路线: 控制器功能: 而且我导入csrf无处不在,因为上次当我做AJAX调用我有这个csrf的问题,下面的代码已经修复了我的问题,但现在不

  • 所以我用拉雷维尔和护照,我有问题。当我向我的AuthController@login这是给我一个500内部服务器错误。以下是我的工作内容 我将laragon与apache服务器和mysql一起用于Environment。我可以毫无问题地向我的注册路径发出请求,但我的登录路径一直失败。不确定我错过了什么 这是我的AuthController。php 这是我存储在中的变量。环境文件 这是我的api路由