Abraksis:
私が受けたRESTfulなサービス持っているPOST
とのリクエストをUUID
値とDBに書き込むし。だから、問題があれば検証することでUUID
有効かではありません。この目的のために、私は、カスタムアノテーションを実装しました:
@Constraint(validatedBy = {})
@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Pattern(regexp = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}")
public @interface validUuid {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
しかし、いくつかの理由のために、それは私が有効で合格しても、仕事をしないUUID
、私は常に例外を取得します:
javax.validation.UnexpectedTypeException:HV000030:いいえバリデータは、制約「javax.validation.constraints.Pattern」の検証型「java.util.UUID」の見つけることができます
検証するための任意のオプションがありUUID
、適切には?
ニコラス:
あなたは適用することはできません@Pattern
何か(に注釈をjava.util.UUID
でないこと)CharSequence
。@Pattern
注釈文書(emphesizes鉱山):
受け入れのCharSequenceを。null要素が有効と考えられています。
また、私の知る限り見るように、あなたは、新しい注釈の定義に渡すことで、検証注釈ハンドラの動作を拡張してみてください。
あなたは、より複雑な検証を実行したい場合は、単にあなたの注釈を作成せずに、別の検証アノテーション-その組み合わせは次のように動作しません。が存在しなければならない何か注釈を認識し、それらを検証します。
@Target({ElementType.FIELD})
@Retention(RUNTIME)
public @interface ValidUuid {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
さて、実装バリデータの作成ConstraintValidator<ValidUuid, UUID>
、検証自体を実行するメソッドをオーバーライドしています。
public class UuidValidator implements ConstraintValidator<ValidUuid, UUID> {
private final String regex = "....." // the regex
@Override
public void initialize(ValidUuid validUuid) { }
@Override
public boolean isValid(UUID uuid, ConstraintValidatorContext cxt) {
return uuid.toString().matches(this.regex);
}
}
そして、アノテーションを適用します。
@ValidUuid
private UUID uuId;