我在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。
答案 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()
方法,因此可以跳过整个模块设置