我目前正在一个项目中工作,我有一个用户模型并使用REST API来获取用户列表。 (我有更多的实体)。
用户有密码字段。我不想在结果中包含密码字段。所以我把它排除在DTO之外。但是当我想创建一个用户时,我想在请求中包含密码。所以Spring MVC获得了User实体(而不是DTO)。
我不认为这样做很好....例如,我有一个事件模型,它连接到具有多对多关系的用户。我在请求中不希望这样。我只想要用户。那么你建议我做什么?有另一种DTO吗?
提前致谢。
答案 0 :(得分:15)
仅将
@JsonIgnore
与Access.WRITE_ONLY
一起用于getter方法
示例
@JsonProperty(access = Access.WRITE_ONLY)
private String password;
答案 1 :(得分:4)
如果您使用jackson序列化您的响应对象,您可以使用@JsonIgnore注释相关属性,并且它不会包含在响应中。
public User {
private String email;
@JsonIgnore
private String password
...getters and setters
}
创建单独的响应对象也可能是一个好主意,这些响应对象仅包含您想要的字段,以防您在路上添加敏感字段并忘记隐藏它们。同样,您也可以使用单独的请求对象来创建包含密码字段的用户。像用户这样的业务实体最好只在内部使用,这样你就可以控制哪些信息被公开。
答案 2 :(得分:4)
为避免使用@JsonIgnore,您可以使用json-view library。 例如,在您的控制器中,您可以执行以下操作:
首先在控制器变量中声明:
private JsonResult json = JsonResult.instance();
然后使用此方法:
@RequestMapping("/get/{id}")
public void getUserById(@PathVariable(value = "id") long id) {
User user = usersService.findOne(id);
json.use(JsonView.with(user)
.onClass(User.class, Match.match()
.exclude("password").exclude("yetAnothertopSecretField")));
}
它返回没有排除字段的JSON。
JsonView,JsonResult类从json-view库导入。
答案 3 :(得分:0)
制作字段'密码'发送响应时为null,而杰克逊不会在回复时显示,不要将其从模型类中完全删除。
答案 4 :(得分:0)
我已经尝试过这个JsonProperty.Access.WRITE_ONLY
,它正在与我合作。
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)