【问题标题】:My Validation message not working in Thymeleaf我的验证消息在 Thymeleaf 中不起作用
【发布时间】:2019-01-15 02:17:10
【问题描述】:

我是 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

【问题讨论】:

  • 您可以在您的 HTML 和您的 @GetMapping 方法上发布您的 form 标记吗?
  • 这是我的表单标签,GetMapping 方法是 @GetMapping("/signup" ) public String signup( Model themodel) { //从用户创建一个对象 User user = new User(); themodel.addAttribute("user" , user);返回“注册”; } @bphilipnyc
  • 错字:{*'phone'} 应该是*{phone}
  • 它不工作仍然有同样的错误?
  • Whitelabel 错误页面 此应用程序没有明确的 /error 映射,因此您将其视为后备。 Wed Aug 08 14:51:56 EET 2018 出现意外错误(类型=内部服务器错误,状态=500)。 HV000030:找不到约束“javax.validation.constraints.Size”验证类型“java.lang.Integer”的验证器。检查“电话”的配置

标签: hibernate validation spring-boot thymeleaf


【解决方案1】:

如下更改您的跨度标签。

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

【讨论】:

  • 这些论坛帖子将对您有所帮助。 [forum.thymeleaf.org/…, [forum.thymeleaf.org/th-field-and-th-errors-td4030018.html]
【解决方案2】:

错误信息:

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 使用 th:object 绑定到 user bean。注意 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 文档以获取更多示例。它会给你一个更好的主意。

【讨论】:

    【解决方案3】:
    @PostMapping( "/signup" )
      public String signupPost(@Valid @ModelAttribute("user")  User user ,
               BindingResult thebindResult, Model model ) {
    
        if(thebindResult.hasErrors()) {
            model.addAttribute("invalidPhone" , true);
            return "signup";
    
        }
    

    更改 BindingResult 对象的位置,您必须将 BindingResult 紧跟在您使用 @Valid 验证的对象之后。

    【讨论】:

      【解决方案4】:

      在 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>
      

      【讨论】:

        猜你喜欢
        • 2012-08-29
        • 1970-01-01
        • 2020-10-03
        • 2020-11-05
        • 2013-08-15
        • 2017-08-10
        • 1970-01-01
        • 2018-08-19
        • 2016-11-20
        相关资源
        最近更新 更多