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

时间:2017-12-18 19:19:25

标签: ajax spring spring-mvc spring-restcontroller

我的SpringMVC RestController中存在写入JSON结果的问题:

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

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

ActivitiesT Domain对象,Hiberate-generated:

@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

1 个答案:

答案 0 :(得分:1)

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