Java jsr 303从带注释的字段访问bean字段

时间:2013-06-05 08:21:50

标签: java annotations

在我的场景中,我正在尝试创建一个注释,以验证一个字段是否被填充,如果另一个字段具有某种值。

界面如下所示:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = RequiredIfFieldHasValueValidator.class)
public @interface RequiredIfFieldHasValue
{
    String message() default "Required if selected";

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

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

    /*
    FieldName against which we validate
     */
    String fieldName() default "";

    /*
    Field value that indicates requirement
     */
    String fieldValue() default "";
} 

并实施:

public class RequiredIfFieldHasValueValidator implements ConstraintValidator<RequiredIfFieldHasValue, String>
{
    private String fieldName;
    private String fieldValue;

    @Override
    public void initialize( RequiredIfFieldHasValue constraintAnnotation )
    {
        fieldName = constraintAnnotation.fieldName();
        fieldValue = constraintAnnotation.fieldValue();
        validateParameters();
    }

    @Override
    public boolean isValid( String value, ConstraintValidatorContext context )
    {
        System.out.println( "Validate against fieldname: " + fieldName + " fieldvalue: " + fieldValue );
        //
        //Validation should be here (1)
        //
        return false;
    }

    private void validateParameters()
    {
        if ( "".equals( fieldName ) || fieldName == null )
        {
            throw new IllegalArgumentException( "The fieldname cannot be null" );
        }
    }
}

示例用法:

public class Form {
    private String type;
    @RequiredIfFieldHasValue(fieldName = "type", fieldValue = "DICT")
    private String dictValue;
}

我在Spring MVC中使用它并根据请求验证:

public String myFormPostPost( Model model, @Valid @ModelAttribute MyForm form, indingResult result )

所以我的目标是:If field type has value equal to DICT, field dictValue should be required (not empty)

我的问题是我是否可以访问Validation should be here (1)中的当前bean值?我知道我可以对整个豆做注释,但我会这样做。

1 个答案:

答案 0 :(得分:1)

嗯,我想这是不可能的,所以我坚持使用类anotated解决方案: Cross field validation with Hibernate Validator (JSR 303)

相关问题