Java JSON-覆盖@JsonIgnore进行测试

时间:2018-12-10 17:16:36

标签: java json spring rest jackson2

我在Spring Boot中有项目。我有用户模型,与个人档案模型有关联的OneToOne

用户:(简体)

@Entity
@Table(name = "users")
public class User extends AbstractEntity {

    @Id
    @GeneratedValue
    private Integer id;

    @NotEmpty
    @Basic(optional = false)
    @Column(nullable = false, unique = true)
    private String username;

    @Valid
    @JsonIgnore
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
    private Profile profile;

    @JsonIgnore
    public Profile getProfile() {
        return profile;
    }

    @JsonProperty
    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

配置文件:(简体)

@Entity
@Table(name = "profiles")
public class Profile extends AbstractEntity {

    @Id
    @GeneratedValue
    private Integer id;

    @NotEmpty
    @Basic(optional = false)
    @Column(nullable = false)
    private String name;

    @NotEmpty
    @Basic(optional = false)
    @Column(nullable = false)
    private String surname;

    // Getters, setters, etc
}

我的测试:

 @Test
    public void createUserAndProfileReturnsCreatedStatus() throws Exception {
        final User user = Generator.generateUser();
        user.setProfile(Generator.generateProfile());
        MvcResult mvcResult = this.mockMvc.perform(
                post("/users")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(toJson(user)))
                .andExpect(status().isCreated())
                .andReturn();
    }

问题是,当我执行user.setProfile()时,配置文件被设置为用户,但是当我调用toJson(user)时,由于我在模型中的注释,配置文件被自动忽略了。

如何仅出于测试目的而禁用这些注释?可能吗? 我不想从模型中删除@JsonIgnore批注,因为当我READ GET /users/<id>用户登录时,它们不会公开Profile。

1 个答案:

答案 0 :(得分:0)

这可以通过利用Jackson的Mixin feature实现,您可以在其中创建另一个取消忽略注释的类。 mixin类的唯一要求是具有相同的属性名称和类型。类名并不重要,也不需要实例化它:

public class DoNotIgnoreProfile
{
    @JsonIgnore(false)
    private Profile profile;
}

需要一个Jackson模块来将bean和mixin绑在一起:

@SuppressWarnings("serial")
public class DoNotIgnoreProfileModule extends SimpleModule
{
    public DoNotIgnoreProfileModule() {
        super("DoNotIgnoreProfileModule");
    }

    @Override
    public void setupModule(SetupContext context)
    {
        context.setMixInAnnotations(User.class, DoNotIgnoreProfile.class);
    }
}

现在您需要将模块注册到ObjectMapper中,并且一切就绪:

public string toJson(User user)
{
    try {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new DoNotIgnoreProfileModule());
        return mapper.writeValueAsString(user);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑: 我刚刚看到ObjectMapper有一个addMixin()方法,因此可以跳过整个模块设置