使用@jsonView清空返回对象

时间:2018-04-12 08:57:19

标签: java json jackson

我有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();
}

此返回的用户列表但其权限是空对象。在控制台和数据库中,我按预期得到了一切。有什么建议是错的吗?

3 个答案:

答案 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;