我有User class with privilege list(ManyToMany relationship)。我也使用了一些观点。
@Column(name = "privileges")
@JsonView(Views.Manage.class)
@NotNull
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_privileges",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
private Set<Privilege> privileges;
public static class Views {
private interface Auto extends Manage {
}
public interface Add extends Manage{
}
public interface Manage {
}
}
和特权阶层:
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "privilege")
public class Privilege {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@JsonView(Views.Auto.class)
private Long id;
@Column(name = "name")
@JsonView(Views.Manage.class)
@NotNull
@JsonProperty("name")
private String name;
@Column(name = "description")
@JsonView(Views.Manage.class)
@JsonProperty("description")
private String description;
public static class Views{
private interface Auto extends Manage{
}
public interface Manage{
}
}
}
在控制器中
@GetMapping("/users")
@JsonView(User.Views.Manage.class)
public List<User> getUsers() {
return userRepository.findAll();
}
此返回的用户列表但其权限是空对象。在控制台和数据库中,我按预期得到了一切。有什么建议是错的吗?
答案 0 :(得分:0)
您可以尝试将获取类型更改为eager(在ManyToMany中)吗?
fetch = FetchType.EAGER
答案 1 :(得分:0)
特权是延迟加载的。因此,如果在代码中你执行user.getPrivileges()。get(0),例如它将被加载并且它将设置其属性。问题是,当您序列化为JSON时,这些尚未填充(它们尚未使用)。这就是ORM的工作原理 - 它们保持代理对象而不是实际对象,以减少不必要的负载。您可以将权限设置为FetchType = Eager,如果您总是需要它们,或者您可以在json序列化之前延迟加载它们。
答案 2 :(得分:0)
我明白了。它的发生是因为我有不同的观点。一个用户,一个用于特权。当我将它们连接到一个视图时,它可以工作。
更新:
当您需要来自其他类的JsonView时,您不需要一个视图。 JsonView可以有数组值(嵌套视图)。例如,我的问题已经解决了
@Column(name = "name")
@JsonView({Views.Manage.class, User.Views.Manage.class})
@NotNull
@JsonProperty("name")
private String name;