【问题标题】:Spring boot validate only specific attributes using @valid in formSpring boot 在表单中使用@valid 仅验证特定属性
【发布时间】:2018-01-03 06:54:19
【问题描述】:

在我的 Spring Boot 应用程序中。我有用户类:

public class User {

   private Long id;

   @NotEmpty(message="Field is required.")
   @Size(max=50, message="Field cannot exceed 50 characters in length.")
   private String username;

   @NotEmpty(message="Field is required.")
   @Size(max=50, message="Field cannot exceed 50 characters in length.")
   private String name;

   @NotEmpty(message="Field is required.")
   @Email(message="Please enter valid email address.")
   private String email;

   .... getter and setter here....
}

我创建了用户注册表单,用于验证姓名、用户名和电子邮件。

像这样:

@RequestMapping(value="/user/register", method= RequestMethod.GET)
public String createUserForm(User user){
    return "user/create";
} 

@RequestMapping(value="/user/register", method= RequestMethod.POST)
public String createUser(@Valid User user, BindingResult bindingResult){

    if (bindingResult.hasErrors()) {
        return "users/create";
    }
    //Here code to save user
    return "users/createdSuccess";

}

现在我想为用户创建忘记密码页面。忘记密码页面仅包含电子邮件地址。但是如果我使用验证用户模型,它总是会出错,因为添加了名称和用户名属性的注释。

如何忽略忘记密码页面的名称和用户名注释并仅验证电子邮件地址。

@RequestMapping(value="/account/forgot", method= RequestMethod.GET)
public String forgotPassForm(User user){
    return "users/forgotPassword";
}

@RequestMapping(value="/account/forgot", method= RequestMethod.POST)
public String resetPass(@Valid  User user, BindingResult bindingResult){

    if (bindingResult.hasErrors()) {
        return "users/forgotPassword";
    }

    return "users/passwordEmailSent";

}

【问题讨论】:

    标签: java spring-mvc spring-boot


    【解决方案1】:

    您应该将@Validated-annotation 与提供的验证组和适当的验证器一起使用。在这里你会看到这样的例子: http://www.journaldev.com/2668/spring-validation-example-mvc-validator

    【讨论】:

    • 我改变了这个: public String resetPass(@ModelAttribute("email") @Validated User user, BindingResult bindingResult){ .... 但得到错误:既不是 BindingResult 也不是 bean name 的普通目标对象email' 可用作请求属性
    • 请查看链接,您应该添加一些依赖项并提供您的自定义验证器
    • 我不想创建自定义验证,这是提出这个问题的重点。
    • 所以,你可以通过“忘记密码”-case
    • 什么是忘记密码案例?
    【解决方案2】:

    不知道我的理解是否正确,但我有一个类似的问题,用户更新其凭据,当然有可能,密码-字段为空(如果 用户 不想(重新)设置它)。所以我只是检查密码字段是否为空(它可能是一个“肮脏”的解决方案,但在我的情况下它有效(我另外在 html 端做了一个 form 验证)):

    if (bindingResult.hasErrors()) {
         // ignore field password
         if (!bindingResult.hasFieldErrors("password")) {
              // do something
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2018-06-23
      • 2019-09-07
      • 2020-10-04
      相关资源
      最近更新 更多