在我的场景中,我正在尝试创建一个注释,以验证一个字段是否被填充,如果另一个字段具有某种值。
界面如下所示:
@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值?我知道我可以对整个豆做注释,但我会这样做。
答案 0 :(得分:1)
嗯,我想这是不可能的,所以我坚持使用类anotated解决方案: Cross field validation with Hibernate Validator (JSR 303)