我的验证消息在Thymeleaf中不起作用

时间:2018-08-07 22:11:21

标签: hibernate validation spring-boot thymeleaf

我是Java新手。使用Thymeleaf和Spring-Boot。尝试在输入错误时显示验证消息。 “电话”属性必须介于7到11个字符之间。 如果不遵守规则,将显示验证消息。她是

模型

@Entity
@Table(name="users")
public class User  {
@Column(name="phone")
@Size(min=7 , max=11 , message="Invalid Number")
private int phone;

}

我的控制器

  @PostMapping( "/signup" )
  public String signupPost(@Valid @ModelAttribute("user")  User user ,
          Model model , BindingResult thebindResult ) {

    if(thebindResult.hasErrors()) {
        model.addAttribute("invalidPhone" , true);
        return "signup";

    }

我的观点

                <div class="form-group">
                <label for="phone" class="cols-sm-2 control- 
                label">Phone</label><span class="bg-danger pull-right"   
                th:if="${invalidPhone}" th:errors="{*'phone'}" >phone 
                Error</span>
              <div class="cols-sm-10">
                    <div class="input-group" >
                        <span class="input-group-addon" ><i class="fa 
                fa-phone fa" aria-hidden="false" ></i> </span>
                        <input type="text" class="form-control" 
                th:value="${user.phone}" id="phone" name="phone" 
                roleId="phone" 
                th:field="*{phone}"  placeholder="xxx-xxx-xxxx" 
                required="required"/>
                    </div>
                </div>
                </div

错误

     Neither BindingResult nor plain target object for bean name 'phone' 
     available as request attribute

4 个答案:

答案 0 :(得分:0)

如下更改您的span标签。

<span class="bg-danger pull-right" th:if="${invalidPhone}" th:errors="*{phone}">phone Error</span>

答案 1 :(得分:0)

错误消息:

Neither BindingResult nor plain target object for bean name 'phone' available as request attribute.

基本上表明Spring找不到应绑定的bean。您的表单正在专门查找名为phone的bean名称。实际上,您的bean被称为user

您还可以添加验证器以分离关注点。您可能会进行大量验证:

@Autowired
public UserController(UserFormValidator userFormValidator) {

    this.userFormValidator = userFormValidator;
}

@GetMapping("/signup") 
public String signup(Model model) { 
   model.addAttribute("user" , new User());  //it is expecting a user bean
   return "signup"; 
}

@PostMapping("/signup")
public String signupPost(@ModelAttribute("user") User user, Errors result) {

    userFormValidator.validate(bean, result);
    if(result.hasErrors()) {
       //maybe log it here
       return "signup";
    }
    //some other logic
}

private final UserFormValidator userFormValidator;

然后您将要告诉Spring使用user绑定到th:object bean。请注意phone上经过更正的语法:< / strong>

<form class="form-horizontal" th:object="${user}" method="post" th:action="@{/signup}">
    <div class="form-group">
        <label for="phone" class="cols-sm-2 control-label">Phone</label>
        <span th:errorclass="someErrorClass" th:if="${#fields.hasErrors('phone')}" th:errors="*{phone}">* Please check the Phone field.</span>
        <div class="cols-sm-10">
            <div class="input-group">
                <span class="input-group-addon"><i class="fa fa-phone" aria-hidden="false" ></i> </span>
                <input type="tel" <!-- helpful for mobile -->
                       class="form-control"
                       id="phone"
                       name="phone"
                       th:field="*{phone}"
                       maxlength="255" <!--or whatever, prevents overflowing your DB column-->
                       required="required"/>
            </div>
        </div>
    </div>
</form>

然后,您可以创建一个验证器以支持表单验证:

   @Component
   @Slf4j
   public class UserFormValidator implements Validator {

       @Override
       public boolean supports(Class<?> clazz) {

           return User.class.isAssignableFrom(clazz);
       }

       @Override
       public void validate(Object model, Errors errors) {

           if (!SomeUtil.isFormValidationEnabled()) {
               log.debug("Validation disabled.  Returning.");
               return;
           }

           User user = (user) model;

           if (SomeUtil.isMissing(user.getPhone())) {
               errors.rejectValue("phone",
                      "phone.isMissing",
                      "Please enter a valid phone number.");
           }
       }
   }

您可以阅读Thymeleaf文档以获取更多示例。它会给你一个更好的主意。

答案 2 :(得分:0)

@PostMapping( "/signup" )
  public String signupPost(@Valid @ModelAttribute("user")  User user ,
           BindingResult thebindResult, Model model ) {

    if(thebindResult.hasErrors()) {
        model.addAttribute("invalidPhone" , true);
        return "signup";

    }

更改BindingResult对象的位置,必须在使用@Valid验证的对象之后立即放置BindingResult。

答案 3 :(得分:0)

从 Controller 中,如下编辑。

@PostMapping( "/signup" )
public String signupPost( @ModelAttribute @Valid User user ,BindingResult thebindResult, Model model) {
    if(thebindResult.hasErrors()) {
        model.addAttribute("invalidPhone" , true);
        return "signup";
    }
 }

来自视图编辑

<div class="form-group">
  <label for="phone" class="cols-sm-2 control-label">Phone</label>
  <span class="bg-danger pull-right" th:if="${invalidPhone}">phone Error</span>
  <div class="cols-sm-10">
    <div class="input-group" >
      <span class="input-group-addon" ><i class="fa fa-phone fa" aria-hidden="false" ></i> </span>
      <input type="text" class="form-control" th:field="*{phone}" placeholder="xxx-xxx-xxxx" required="required"/>
    </div>
  </div>
</div

注意 确保您的@GetMapping() 控制器显示注册,您正在将用户传递给模型 即。

@GetMapping 控制器 ........

model.addAttribute("userModel", new User());

........

通知

<form method="post" action="" th:object="${userModel}">
  //signup input...
</form>