Java Spring MVC表单验证/访问验证程序中的表单字段

Java Spring MVC表单验证/访问验证程序中的表单字段,java,forms,spring,spring-mvc,Java,Forms,Spring,Spring Mvc,有一个表单,它的电话号码有时是必需的,有时不是必需的,该表单由spring调用的验证程序类验证。我想让验证器类知道这个字段何时是必需的,如果它是空的,什么时候可以,但是我不确定实现这个字段的正确方法。控制器和验证过程如下所示: @RequestMapping(value = "my/url", method = RequestMethod.POST) public ModelAndView someMethod(@Valid T myForm, BindingResult bindingResu

有一个表单,它的电话号码有时是必需的,有时不是必需的,该表单由spring调用的验证程序类验证。我想让验证器类知道这个字段何时是必需的,如果它是空的,什么时候可以,但是我不确定实现这个字段的正确方法。控制器和验证过程如下所示:

@RequestMapping(value = "my/url", method = RequestMethod.POST)
public ModelAndView someMethod(@Valid T myForm, BindingResult bindingResult) {
    //Calling the validation...
    if (bindingResult.hasErrors()) {
        // didn't pass validation 
    } else {
        // is ok!
    }
}
表单看起来像这样。isI可以添加另一个字段来确定是否需要电话号码,如果我以后在验证电话字段时能找到使用它的方法。它有@Phone注释:

public class MyForm implements Serializable {

    private static final long serialVersionUID = 1L;

    @Phone
    private String phone;

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}
@Phone注释指定将验证数据的类

 @Target({CONSTRUCTOR, FIELD, METHOD, PARAMETER})
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = ValidateField.class)
 public @interface Phone {

     String message() default "{default.phone.errormsg}";
     int maxLength() default 64;

     Class<?>[] groups() default {};
     Class<? extends Payload>[] payload() default {};
 }
@Target({CONSTRUCTOR,FIELD,METHOD,PARAMETER})
@保留(运行时)
@记录
@约束(validatedBy=ValidateField.class)
公共@接口电话{
字符串消息()默认值“{default.phone.errormsg}”;
int maxLength()默认值为64;
类[]组()默认值{};

实际上,这不是关于Spring的,而是关于JSR-303,又名.Bean验证。在约束验证器中不可能访问父Bean的其他字段(据我所知)。相反,您需要定义Bean级别的约束,它包含Desired逻辑。
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    //...

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        // I want to check if the "required" field was passed from form here
        // to know if it's ok for the field to be empty
        if (StringUtils.isEmpty(value) /* && isNotRequired */) {
            return true;
        }

        return notBlank(value, context)
                && maxLength(value, context, maxLength) /* and other constraints... */;
    }

   //...
}