首页 > 解决方案 > 我的验证消息在 Thymeleaf 中不起作用

问题描述

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

该模型

@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

标签: hibernatevalidationspring-bootthymeleaf

解决方案


的错误信息:

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

基本上表明Spring找不到它应该绑定的bean。您的表单正在专门寻找一个名为phone. 实际上,您的 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 使用 .bin 绑定到userbean th:object 请注意以下更正的语法phone

<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 文档以获取更多示例。它会给你一个更好的主意。


推荐阅读