クライアントとサーバーでRequestFactoryを使用して同じ検証アノテーションを使用するための(一時的な)ソリューションを見つけました。
JSR 303アノテーションを、プロキシ・インターフェース(クライアント)とドメイン・クラス(サーバー)の両方によって実装される別個のインターフェースに配置します。もちろん、このインターフェースは共有パッケージに含まれている必要があります。
検証アノテーションは継承階層に自動的に渡されるため、検証はサーバーだけでなくクライアントでも機能するはずです。
例
ユーザーが登録しようとしたときに使用されるオブジェクトの例を次に示します。
UserProxyValid
JSR303検証アノテーションを含む共通インターフェースです。
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のアップデートを提供するとすぐに、そのクラスを削除してアノテーションをドメインクラスに移動できる可能性があります。