[英]Java jsr 303 accessing bean fields from annotated field
在我的场景中,我试图创建注释,以验证如果另一个字段具有某种值,是否填充了一个字段。
该界面如下所示:
@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值Validation should be here (1)
? 我知道我可以对整个bean进行注释,但是我更喜欢这样。
好吧,我想这是不可能的,所以我坚持使用带类注释的解决方案: 使用Hibernate Validator(JSR 303)进行跨字段验证
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.