Spring 一对多关系抛出异常:org.springframework.http.converter.HttpMessageNotWritableException
Spring One-To-Many relationship throws Exception : org.springframework.http.converter.HttpMessageNotWritableException
我尝试使用 spring 在两个实体之间创建一个简单的关系。一个 User
个实体包含许多 profile
个实体。
用户实体
@Entity
public class User {
@OneToMany(mappedBy = "user")
private List<Profile> profiles;
public List<Profile> getProfiles() {
return profiles;
}
public void setProfiles(List<Profile> profiles) {
this.profiles = profiles;
}
}
配置文件实体
@Entity
public class Profile {
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
当我尝试在 @RestController
中查找带有 this.profileRepository.findById(id).get()
的配置文件时,出现此错误:
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: User.profiles, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: User.profiles, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->User["profiles"])]
The server encountered an unexpected condition that prevented it from fulfilling the request.
任何人都可以向我解释为什么这不起作用吗?我遵循了 this 教程。
正如Mandar所说,你可以通过eager fetch
来解决。但是如果你不想获取所有我的意思 eager fetch
,那么你必须像这样将它们初始化为延迟获取到相关的 class,你的配置文件 class:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Profile implements Serializable{
//
//
.. your other stuffs
}
编辑: 也像这样更改您的用户实体:
@Entity
public class User implements Serializable{
@OneToMany(mappedBy = "user")
private List<Profile> profiles = new LinkedHashSet<Profile>();
//...other stufs..
.
.
}
希望这会有所帮助!
我遇到了同样的问题。
但我收到“已解决 [org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:未能延迟初始化角色集合的错误:”
因为我没有在 viewDTO
中声明 toString 方法
以下是我做过的事情
- 在服务方法中声明@Transactional。
- 在持久化 DTO 中声明字段如下
@Convert(converter = StringListConverter.class)
@JsonIgnore
@ElementCollection
protected List<String> someField;
哪里
public class StringListConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> list) {
return String.join(",", list);
}
@Override
public List<String> convertToEntityAttribute(String joined) {
return new ArrayList<>(Arrays.asList(joined.split(",")));
}
}
- 正在从持久性 DTO 中创建 viewDTO 并在响应实体中设置 viewDTO。
我尝试使用 spring 在两个实体之间创建一个简单的关系。一个 User
个实体包含许多 profile
个实体。
用户实体
@Entity
public class User {
@OneToMany(mappedBy = "user")
private List<Profile> profiles;
public List<Profile> getProfiles() {
return profiles;
}
public void setProfiles(List<Profile> profiles) {
this.profiles = profiles;
}
}
配置文件实体
@Entity
public class Profile {
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
当我尝试在 @RestController
中查找带有 this.profileRepository.findById(id).get()
的配置文件时,出现此错误:
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: User.profiles, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: User.profiles, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->User["profiles"])]
The server encountered an unexpected condition that prevented it from fulfilling the request.
任何人都可以向我解释为什么这不起作用吗?我遵循了 this 教程。
正如Mandar所说,你可以通过eager fetch
来解决。但是如果你不想获取所有我的意思 eager fetch
,那么你必须像这样将它们初始化为延迟获取到相关的 class,你的配置文件 class:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Profile implements Serializable{
//
//
.. your other stuffs
}
编辑: 也像这样更改您的用户实体:
@Entity
public class User implements Serializable{
@OneToMany(mappedBy = "user")
private List<Profile> profiles = new LinkedHashSet<Profile>();
//...other stufs..
.
.
}
希望这会有所帮助!
我遇到了同样的问题。 但我收到“已解决 [org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:未能延迟初始化角色集合的错误:” 因为我没有在 viewDTO
中声明 toString 方法以下是我做过的事情
- 在服务方法中声明@Transactional。
- 在持久化 DTO 中声明字段如下
@Convert(converter = StringListConverter.class)
@JsonIgnore
@ElementCollection
protected List<String> someField;
哪里
public class StringListConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> list) {
return String.join(",", list);
}
@Override
public List<String> convertToEntityAttribute(String joined) {
return new ArrayList<>(Arrays.asList(joined.split(",")));
}
}
- 正在从持久性 DTO 中创建 viewDTO 并在响应实体中设置 viewDTO。