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 方法

以下是我做过的事情

  1. 在服务方法中声明@Transactional。
  2. 在持久化 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(",")));
    }

}

  1. 正在从持久性 DTO 中创建 viewDTO 并在响应实体中设置 viewDTO。