找到了一个(临时)解决方案,可以在客户端和带有 RequestFactory的服务器上使用相同的验证注释:
将 JSR 303 注释放在由代理接口(客户端)和域类(服务器)实现的单独接口中。当然,这个接口必须在共享包中。
由于验证注释将自动向下传递继承层次结构,验证现在应该在客户端和服务器上工作。
例子
以下是用户尝试注册时使用的对象示例:
UserProxyValid
是包含 JSR 303 验证注释的通用接口:
public interface UserProxyValid {
@NotBlank(
groups = {ClientGroup.class, ServerGroup.class})
@UniqueEmail(
groups = {ServerGroup.class})
String getEmail();
@NotBlank(
groups = {ClientGroup.class, ServerGroup.class})
@Size(
min = 4, max = 25,
groups = {ClientGroup.class, ServerGroup.class})
String getPassword();
}
User
是服务器上的域类:
public class User implements UserProxyValid {
private String email;
private String password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最后UserProxy
是客户端:
@ProxyFor(value = User.class)
public interface UserProxy extends ValueProxy, UserProxyValid {
String getEmail();
void setEmail(String email);
String getPassword();
void setPassword(String password);
}
团体
通过组,我们可以确保单独的验证要么在客户端上完成,要么仅在服务器上完成,或者同时在两者上完成。(和上面的例子一样,电子邮件唯一性的验证只能在服务器上完成。)
这是您在客户端上验证对象的方式:
Validator clientValidator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<UserProxy>> violations = clientValidator.validate(userProxy, ClientGroup.class);
以下是在服务器上进行验证的方式:
Validator serverValidator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<User>> violations = serverValidator.validate(user, ServerGroup.class);
对未来的希望
当然,如果没有额外的UserProxyValid
类会更好。因此,一旦 Google 提供了BeanValidation的更新,我们就可以消除该类并将注释移至域类。