2017-12-18 8 views
0

Stringを特定のEnumに対して検証するカスタムアノテーションを作成しようとしています。私はHibernate Validator APIを使用しています。望ましいユースケースは次のようになります。列挙型に対して文字列を検証するカスタム注釈

@MessageTypeOf(MessageType.NETWORK) 
private String message; 

String(この場合、MessageType.NETWORK)列挙引数として与えられた列挙のtoString()メソッドから所与の値に対して検証されなければなりません。

私はバリデーターを書いており、このように見えます。

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> { 

    private Set<String> values; 

    @Override 
    public void initialize(MessageTypeOf constraintAnnotation) { 
     values = Arrays.asList(MessageType.values()) 
       .stream() 
       .map(v -> v.toString()) 
       .collect(Collectors.toSet()); 
    } 

    @Override 
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) return false; 

     return values.contains(s); 
    } 
} 

注釈。文字列は、私は特定のものに対して検証する必要があるとして列挙(任意の値)の一部である場合

@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = MessageTypeValidator.class) 
@Documented 
public @interface MessageTypeOf { 

    String message() default "{org.hibernate.validator.referenceguide.chapter06.CheckCase." + 
      "message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 

    MessageType value(); 

    @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE }) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 
     MessageType[] value(); 
    } 
} 

しかし、これは有効であろう。誰かがそれを行う方法を提案できますか?

+0

あなたが同じように列挙型を使用していない理由がありますフィールドタイプは直接ですか? – chrylis

答えて

1

基本的に、このプロパティの唯一の有効な値はMessageType.NETWORK.toString()です。それは、(一つだけ有効な値を持つことができる文字列を提供するために、クライアントを期待して)かなり奇妙だが、とにかく、あなたはちょうどそれをチェックする必要があります。

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> { 

    private String validValue; 

    @Override 
    public void initialize(MessageTypeOf constraintAnnotation) { 
     this.validValue = constraintAnnotation.value().toString(); 
    } 

    @Override 
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     return this.validValue.equals(s); 
    } 
} 
関連する問題