无法写入HTTP消息:org.springframework.http.converter.HttpMessageNotWritableException:

时间:2016-05-02 13:07:22

标签: java spring hibernate spring-mvc

我是Spring MVC框架的新手。我试图使用Hibernate检索用户详细信息以返回我的Spring项目中的对象。我收到以下错误:

  

警告:   org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver    - 无法编写HTTP消息:org.springframework.http.converter.HttpMessageNotWritableException:   无法写内容:没有找到类的序列化程序   org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer而且没有   发现创建BeanSerializer的属性(以避免异常,   禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用   链:   com.ppts.mschef.util.api.ApiResponse ["对象"] - > com.ppts.mschef.model.Mischef ["用户"] - > com.ppts。 mschef.model.User _ _ $$ jvstb3_6 ["处理"]);   嵌套异常是   com.fasterxml.jackson.databind.JsonMappingException:没有序列化程序   上课时发现   org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer而且没有   发现创建BeanSerializer的属性(以避免异常,   禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用   链:   com.ppts.mschef.util.api.ApiResponse ["对象"] - > com.ppts.mschef.model.Mischef ["用户"] - > com.ppts。 mschef.model.User _ _ $$ jvstb3_6 ["处理"])

任何人都可以告诉解决方案这个错误吗?

3 个答案:

答案 0 :(得分:7)

This works for me : 
http://www.geekabyte.io/2013/09/fixing-converterhttpmessagenotwritablee.html


The fix is to get Jackson to be able to handle bi-directional references. And this is done by using two Annotations: @JsonManagedReference and @JsonBackReference.

@JsonManagedReference is used to annotate the inverse side while @JsonBackReference maps the owning side of the relationship.

Example :
@Entity
class Parent {

     @Id
     @Column(name="parent_id")
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;

     private String name;
     private Parent wife;

     @OneToMany(mappedBy="parent" cascade = CascadeType.ALL)
     @JsonManagedReference
     private Collection<Child> children = new ArrayList<>();
...
}


@Entity
class Child {
    private String name;

    @ManyToOne
    @JoinColumn(name="parent_id", referencedColumn="parent_id")
    @JsonBackReference
    private Parent parent;
...
}

答案 1 :(得分:1)

您的用户模型是否具有嵌套的子模型?基本上因为所有这些模型都是延迟加载的,所以你似乎遇到了上面提到的错误。您可以通过命名查询初始化子对象,并将它们拉入用户对象的持久化上下文中,以解决问题。

答案 2 :(得分:0)

您应该使用fetch type = eager - &gt;声明所有关系fetch = FetchType.EAGER,但是如果使用annoptation忽略你的关系@JsonIgnore没有必要这样做。

示例:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="area_id")
@NotNull(message = "El campo area no puede ir vacío")
@JsonView(DataTablesOutput.View.class)
private Area area;

@OneToMany(mappedBy = "proceso", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonIgnore
private List<Trabajador> trabajadorList;