2017-12-11 25 views
0

2つのスプリングフォームフィールドが等しいかどうかを確認するカスタム検証アノテーションが作成されています。カスタム検証アノテーションが失敗します

PasswordVerification:

@Constraint(validatedBy = PasswordVerificationValidator.class) 
@Target({ElementType.TYPE, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PasswordVerification { 
    String message() default ""; 

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

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

} 

PasswordVerificationValidator:

public class PasswordVerificationValidator implements ConstraintValidator<PasswordVerification, UserFormRegistration> { 

    @Override 
    public void initialize(PasswordVerification constraintAnnotation) {} 

    @Override 
    public boolean isValid(UserFormRegistration userFormRegistration, ConstraintValidatorContext context) { 
     return userFormRegistration.getPassword().equals(userFormRegistration.getVerifyPassword()); 
    } 
} 

がUserFormRegistration:注釈はクラスUserFormRegistrationに適用されている場合

@PasswordVerification(message = "Password and password confirmation fields don't match") 
public class UserFormRegistration { 
    private String password; 
... 

そう、それが正常に動作します。しかし、それをフィールドに適用したい場合(下記参照)、失敗します。

public class UserFormRegistration { 
    @PasswordVerification(message = "Password and password confirmation fields don't match") 
    private String password; 
... 

例外:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'ua.com.vertex.validators.interfaces.PasswordVerification' validating type 'java.lang.String'. Check configuration for 'password' 

修正する方法は?

+0

私はここで答えを見つけることができると思う:https://stackoverflow.com/questions/2469473/variable-field-in-a-constraint-annotation –

+0

ありがとう、それは有用だった – sva605

答えて

0

は、私はあなたが今@PasswordVerificationは、メソッド、クラス、インターフェイスに適用されますので、

@Target({ElementType.TYPE, ElementType.FIELD,ElementType.METHOD}) 

@Target({ElementType.TYPE, ElementType.FIELD})を変更ElementType.METHOD

を持っている必要がありますので、メソッドレベルの注釈を適用したいと思います、列挙型、およびフィールド

+0

それは役に立たなかった。同じ例外 – sva605

+0

@ sva605をきれいにして実行しようとしましたか? – SpringLearner

+0

クラスの代わりに文字列フィールドに適用すると、ConstraintValidatorはBeanではなくStringを受け取り、ConstraintValidator の代わりにConstraintValidator を受け取ります。私は当初からそれを理解していなかったので、例外がスローされたのです – sva605