【问题标题】:Custom form validation in Spring bootSpring Boot 中的自定义表单验证
【发布时间】:2016-06-30 06:13:33
【问题描述】:

我正在开发一个 Spring Boot 应用程序,并且我有一个密码重置表单。我正在使用这样的类来验证输入。

public class PasswordResetForm {

    @NotEmpty
    @Size(min=6, message="must be at least 6 characters")
    private String password;

    private String passwordConfirm;

    //Getter and Setters
}

所以,我现在想验证字段 passwordConfirm 和 password 是否相等,我搜索了所有内容,但找不到在这种情况下如何添加自定义验证。那么,如何为其他字段添加自定义验证呢?

我的控制器的动作是这样的

@RequestMapping(value = "/password-change/{id}-{tokenNumber}", method = RequestMethod.POST)
public String changePassword(@PathVariable String id, @PathVariable String tokenNumber, @Valid PasswordResetForm form, BindingResult formBinding, Model model) {

    if (formBinding.hasErrors())
        return "change-password";

    //Other stuff
}

【问题讨论】:

    标签: spring-boot bean-validation custom-validators


    【解决方案1】:

    或者如果您只想验证这种情况(passwordConfirm 和密码相等)。

    你可以使用@AssertTrue。

    @AssertTrue
    public boolean isDifferentPass() {
        return !password.equals(passwordConfirm);
    }
    

    如果这两个字段相同,那么你的控制器的 BindingResult 有错误

    【讨论】:

    • @AssertTrue(和@AssertFalse)为我工作!无论如何,我建议用一个更简单的表达式来改变这个表达式(在你的表达式中使用很多不必要的布尔链接):@AssertTrue public boolean isEqualPass() { return password.equals(passwordConfirm); }
    • 对此的另一个提示:要自定义显示给用户的错误消息,只需使用注释的“消息”属性:@AssertTrue(message = "Passwords doesn't match"),如果您在 Spring 项目中配置了 i18n,您可以使用 "AssertTrue" + "." 键在 messages_xx.properties 文件中本地化消息。 + [验证方法的Java bean名称]。在上面的示例中,键/值将是:AssertTrue.equalPass=Passwords doesn't match
    【解决方案2】:

    您可以使用@Validated 注解来强制验证@RequestParam 和@PathVariable。 @Valid 强制验证@RequestBody

    【讨论】:

      【解决方案3】:

      根据您的需要,您可以考虑创建自定义@Constraint。您将首先创建约束注释:

      @Target({ElementType.METHOD, ElementType.FIELD})
      @Retention(RetentionPolicy.RUNTIME)
      @Constraint(validatedBy=MyConstraintValidator.class)
      public @interface MyConstraint {
      }
      
      And then the constraint validator:
      
      import javax.validation.ConstraintValidator;
      
      public class MyConstraintValidator implements ConstraintValidator {
      
          @Autowired;
          private Foo aDependency;
          ...
      }
      

      您可以在此处找到更多参考: Dependency Injection in JSR-303 Constraint Validator with Spring fails

      在 Spring Docs 上:

      http://docs.spring.io/autorepo/docs/spring/3.2.x/spring-framework-reference/html/validation.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 2020-04-12
        • 2017-03-17
        • 2021-04-21
        • 2017-07-14
        相关资源
        最近更新 更多