当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf验证:。hasErrors不会触发

戚永福
2023-03-14

我正在尝试验证表单字段集的输入值,并在发生无效输入时使Thymeleaf显示一些错误消息。但不知何故,以下Thymeleaf命令从未以正确的方式得到解决:

<p th:if="${#fields.hasErrors('itemId')}" th:errors="{*all}">Name Error</p>

关于我的环境的更多信息,我想不会有什么坏处:

根据Spring GS指南“验证表单输入”,我实现了相关的控制器方法,如下所示:

控制器:

[...]
        @RequestMapping(value = "/explorer/optaResultRequest", method = RequestMethod.POST)
    public String optaResultRequestPOST(
            HttpServletRequest httpRequest,
            ModelMap model, 
            @ModelAttribute("request") @Valid SomeRequest userRequest,
            final BindingResult bindingResult)
    {

        /* To destroy existing "request" attribute: */
        model.clear();

        /* Check for invalid values: */
        if (bindingResult.hasErrors())
        {
            for (int i = 0; i < bindingResult.getAllErrors().size(); i++)
            {
                log.info(bindingResult.getAllErrors().get(i).getObjectName());
                log.info(bindingResult.getAllErrors().get(i).getCode());
                log.info(bindingResult.getAllErrors().get(i).toString());
            }

            /* Refill the model with a new, empty "request" attribute. */
            model.addAttribute("currRequest", userRequest);
            model.addAttribute("request", new SomeRequest());

            return "mypage";
        }

        // Process valid request... 
    }

当我向控制器提交无效的表单输入时,它会根据需要运行if子句,这样打印log.infos并再次返回相同的页面(mypage)-但是提到的Thymeleaf命令不显示任何内容。

慰问:

 2015-07-22 16:22:28.151  INFO 6896 --- [nio-8080-exec-6] Controller   :
 request
 2015-07-22 16:22:28.151  INFO 6896 --- [nio-8080-exec-6] Controller   :
 NotEmpty
 2015-07-22 16:22:28.151  INFO 6896 --- [nio-8080-exec-6] Controller   :
 Field error in object 'request' on field 'itemId':
        rejected value [];
        codes [NotEmpty.request.itemId,NotEmpty.itemId,NotEmpty.java.lang.String,NotEmpty];
        arguments [org.springframework.context.support.DefaultMessageSourceResolvable: 
                  codes [request.itemId,itemId]; 
                  arguments []; 
                  default message [itemId]]; 
        default message [may not be empty]

mypage。html如下所示(原因的简化和缩短):

mypage.html

<form action="#" th:object="${request}" th:action="@{/mypage}" method="post">
    <fieldset>
      <div>
        <!--  ItemId -->

        <div>
          <label>ItemId</label>
        </div>

        <div>
          <input type="text" th:field="*{itemId}" th:placeholder=
          "${currRequest.itemId}" />
        </div>

        <p th:if="${#fields.hasErrors('itemId')}" th:errors="{*all}">Name Error</p>
      </div>
    </fieldset>
  </form>

所以我有两个问题:

>

  • 显然:如何显示错误消息?

    我真的很想更深入地进行调试,但不幸的是,我不知道如何调试Thymeleaf和(Java)MVC(使用STS)。我只想把所有东西的详细日志记录进去<但是,也就是说,我如何跟踪像#字段这样的Thymeleaf变量的当前/最终值。hasErrors()?

    非常感谢您的努力!

  • 共有2个答案

    梁丘缪文
    2023-03-14

    你的*在错误的地方

    编辑

    <代码>

    骆磊
    2023-03-14

    好的,组合模型。清除();和模型。addAttribute(“request”,new SomeRequest());这就是原因。

    我不太清楚Thymeleaf引擎在返回语句之后被调用,因此它只能访问新的空请求对象,该对象没有无效属性。

    另一方面,POST方法内的记录器访问bindingResult对象,因此它可以打印验证信息,而与方法内的模型及其属性发生的情况无关。

     类似资料:
    • 如何验证输入,以便当输入为空时弹出消息

    • 假设我有一个非常简单的模型,我想验证它的标题是否为空白。 在服务层上,我执行如下验证(使用Hibernate验证器): 我的资源是: null 编辑 我忘了提到,将方法范围从private更改为public可以使验证工作。

    • 我计划使用API中的 波姆。xml 位置检查。JAVA 位置验证器。JAVA 位置JAVA 机器人。JAVA 一个pp.java 这里的问题是,上的

    • 我缺少一些真正基本的东西(与EAR或EAR配置中的类加载相关)。我不明白,为什么我的JSR303验证和Hibernate验证不是从EAR内部触发的...如果我创建一个新的战争项目,它就会触发。 我正在Weblogic Server10.3上用Maven、JSF2.0、Open-JPA、EJB3.0建立一个新项目。我使用maven原型创建了所有项目。我有一个最终的EAR构建,它的结构如下: 项目名称

    • 我有一个名为BigPanel的JPanel子类作为JFrame的内容窗格,在BigPanel对象中有一个嵌套的JPanel子类。单击按钮,嵌套面板应该从一个JPanel子类更改为另一个。嵌套面板没有重置,正确的子类将打印到控制台,但实际面板不会更新包com.grantbroadwater;

    • 我在验证表单时遇到了Thymeleaf问题。我正在尝试创建简单的用户注册表单来学习Spring,不幸的是我被卡住了。 这是我的UserForm类 第一个问题是在initBinder中添加自定义验证器类时 @Not空验证注释的“默认”停止工作。这是预期行为吗? 第二个问题是如何在thymeleaf中显示全局拒绝消息 我的validator类如下所示 和后映射从控制器 作为“默认”验证错误,我可以使用