从RestController返回的域对象导致AJAX错误;自定义模型对象有效

问题描述 投票:0回答:1

我的SpringMVC RestController中有一个写JSON结果的问题:

1)当我返回如下所示的域对象,ActivitiesT时,我在客户端获得了AJAX 500内部服务器错误。

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    return activitiesT;
}

活动域对象,Hibernate生成的:

@Entity
@Table(name = "activities_t", schema = "public")
public class ActivitiesT implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private int id;
    //... etc...
}

2)但是当我返回自定义POJO时,AJAX方法有效。它几乎是一样的。

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    // Create a custom Activity POJO and return it
    return new Activity(activitiesT.id, activitiesT.title);
}

活动自定义POJO:

public class Activity implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public int id;
    public String title;
     //etc.

错误信息

HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - 

没有会话(通过参考链:com.myapp“)

有些事情需要注意:

  • 这两个对象都实现了Serializable,这很好
  • 问题不是DAO,我可以看到DAO总是为两者返回正确的数据,我们可以忽略DAO片
  • Controller使用@RestController注释,因此它总是输出JSON;我不需要ResponseBody或旧标签

关于问题可能在哪里的任何想法?问题归结为:

  • 我无法从Hibernate生成的@Entity POJO上的RestController方法返回JSON,
  • 但我可以在我自己的自定义POJO上从RestController方法返回JSON
ajax spring spring-mvc spring-restcontroller
1个回答
1
投票

当Jackson准备响应时,它递归地尝试将模型类转换为JSON。例如,如果你有一对多关系的Department和Employee关系,那么Jackson在Department.java中执行getEmployees()方法来准备响应。但是getEmployees()方法要求hibernate执行另一个查询,以便在延迟加载时从DB获取员工记录。但会议已经结束。因此,您收到此错误。为了避免这种情况,请始终使用DTO而不是实际的模型类。您提到的同样的事情 - 从RestController返回的域对象会导致AJAX错误;自定义模型对象有效。

© www.soinside.com 2019 - 2024. All rights reserved.