我试图限制使用 Jackson JSONViews 对 JSON 对象的哪些属性进行反序列化。目的是使用它来防止我的 API 的使用者提交他们不应该提交的数据。
问题是,我要么误解了 JSONViews,要么做错了什么。见下文。
我在 Spring 开始尝试这样做,但注意到即使下面的简单测试也不起作用。
账户类
public class Account {
@Id
private String id;
private String name;
private List<String> items;
private List<User> users;
@JsonView(AccountViews.Private.class)
public void setId(String id) {
this.id = id;
}
@JsonView(AccountViews.Public.class)
public void setName(String name) {
this.name = name;
}
@JsonView(AccountViews.Public.class)
public void setItems(List<String> items) {
this.items = items;
}
@JsonView(AccountViews.Private.class)
public void setUsers(List<User> users) {
this.users = users;
}
}
意见
public class AccountViews {
public interface Public {}
public interface Private extends Public {}
}
测试
@Test
public void testDeserialization(){
ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
Account account = mapper.readerWithView(AccountViews.Public.class).forType(Account.class).readValue("{ \"name\": \"account1\", \"items\": [\"item1\"], \"users\": [ { \"firstname\": \"user1_firstname\", \"lastname\": \"user1_lastname\" }] }");
assertEquals(account.getName(), "account1");
assertNull(account.getUsers());
}
不幸的是,第二个断言失败了,因为 Users 里面有一个用户对象。
基本上,即使“用户”是 Account 的属性,我也不希望该值被反序列化,因为我使用了 JSONView (AccountViews.Public.class)。但是,无论我尝试什么,它似乎总是被反序列化并出现在帐户对象上。
非常感谢任何帮助。
错误
`java.lang.AssertionError: expected null, but was:<[User@609db43b]>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotNull(Assert.java:755)
at org.junit.Assert.assertNull(Assert.java:737)
at org.junit.Assert.assertNull(Assert.java:747)
at`