我是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 ["处理"])
任何人都可以告诉解决方案这个错误吗?
答案 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;