Thymeleaf验证:.hasErrors不会触发

时间:2015-07-22 15:30:03

标签: java spring thymeleaf

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

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

我猜想有关我的环境的更多信息不会受到影响:

基于 Spring GS-Guide “验证表格输入” 我实施了相应的控制器方法如下:

控制器:

[...]
        @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>

所以我有两个问题:

  1. 显然:如何显示错误消息?

  2. 我真的想深入调试 - 但遗憾的是我不知道如何调试Thymeleaf和(Java)MVC(使用STS)。我只设法包括所有内容的详细记录 但是,我如何跟踪Thymeleaf变量的当前/最终值,例如#fields.hasErrors()

  3. 非常感谢您的努力!

2 个答案:

答案 0 :(得分:3)

好吧,组合 model.clear(); model.addAttribute(“request”,new SomeRequest()); 就是原因。

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

另一方面,POST方法中的记录器访问bindingResult-Object,因此它可以独立于模型及其在方法内的属性发生的情况打印验证信息。

答案 1 :(得分:1)

你的*在错误的地方

修改

[TestMethod] public void DoesSomething_behaves_correctly() { var expected = 42; var container = new UnityContainer(); var foo = container.Resolve<DoesSomething>(); int actual = foo.DoesImportant(21, 21); Assert.AreEqual(expected, actual); }