我有这些只读字段,需要安全,如密码。假设我们有一个用户对象:Dropwizard仅在@POST上验证字段
public class User {
@NotEmpty
@Size(max = 100)
private String name;
@NotEmpty
private String username;
@NotEmpty
@Email
private String email;
private String password;
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
}
所以,这很好用;如我可以得到/张贴/放置任何我想要的,但我永远不会收到密码。但我也想确保当它第一次发布时,密码不应该是空的。如果我做
@NotEmpty
private string password;
然后我的PUT(编辑)请求将失败,验证错误,如果我不想更改此用户的密码。
有两个解决方案,我能想到的:
继承User类,仅创建了POST一类特殊的,可以有超过吸气剂@NotEmpty注解。
public static class Create extends User {
@NotEmpty
@Override
public String getPassword() {
return password;
}
}
这应该一般工作,但不适合我的代码库,因为它已经在CRUD资源上大大利用了继承。我需要为这种方法打破并重复很多事情。在资源类
2-处理验证:
public class UserResource {
@POST
public User createUser(User user) {
if(user.getPassword().isEmpty()) {
throw new ConstraintValidation....();
}
}
}
做工作,但不是那么漂亮。特别是因为我有这些5-10。
其他选择?
你能不能让你自己的验证器实现,而不是使用默认的,然后有更复杂的检查?例如,您可以有一个验证程序,可以检查用户是否存在(如果不是您正在创建),然后基于此验证密码。我不认为你有权访问验证器中的资源类型,除非你实现了一个将你的方法类型存储在一个threadLocal或类似的愚蠢的球衣过滤器。 – pandaadb
其实,阅读球衣信息,你可以在你的验证器中注入UriInfo。然后,您将不会根据所调用的资源方法验证问题。请参阅:https://jersey.java.net/documentation/latest/bean-validation.html – pandaadb
啊哈,我实际上已经考虑过这一点,并检查ConstraintValidatorContext的字段,看看我能否找到相关的东西。没有想到球衣注射。我想这也适用于hibernate-validator,对吧?如果是这样,你可以创建一个答案,我可以标记它。谢谢! – Natan