Spring Thyme Leaf 检查全局错误导致 NPE
Spring Thyme Leaf checking for global errors results in NPE
为了显示使用 Spring MVC with Thyme Leaf 创建的全局错误,我尝试了 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#global-errors 中给出的示例:
即:
<div th:if="${#fields.hasGlobalErrors()}">
和
<ul th:if="${#fields.hasErrors('global')}">
和
<div th:if="${#fields.hasGlobalErrors()}">
当我将它们添加到我的 HTML 时,页面甚至不会呈现,更不用说提交表单了。所有示例的结果为:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#fields.hasErrors('global')"
我用 v2.1.4 和 v.2.1.3 试过这个,但得到了同样的错误。 Bug 还是我做错了什么?
是的,标签全部闭合且格式正确。是的,这段代码在一个表单中。是的,表单的所有其他方面都可以在没有全局错误检查的情况下工作。
这是破损的简短版本 HTML:
<form action="search.html" th:action="@{/auto/search}">
<p th:if="${#fields.hasErrors('global')}" th:errors="*{global}">
Incorrect date
</p>
<input type="text" th:field="${command.stockNumber}" />
<select th:field="*{command.startYear}">
<option value="" th:each="year : ${modelYears}" th:value="${year}"
th:text="${year}"></option>
</select>
</form>
还有控制器..
@RequestMapping(value = "/auto/search", method = RequestMethod.POST)
public String search(@Validated
@ModelAttribute("command")
AutoSearchCommand autoSearchCommand
BindingResult result, Model model) {
return "search";
}
已解决:
在全局错误检查之前的标记中需要 th:object
。不幸的是,Spring 百里香叶 tutorial 中没有提到这一点。据推测,我在我的控制器中覆盖了某处的默认表单名称。
在这个工作中添加标签结果html:
<form action="search.html" th:action="@{/auto/search}">
<div th:object="${command}" th:remove="tag">
<p th:if="${#fields.hasErrors('global')}" th:errors="*{global}">
Incorrect date
</p>
</div>
<input type="text" th:field="${command.stockNumber}" />
<select th:field="*{command.startYear}">
<option value="" th:each="year : ${modelYears}" th:value="${year}"
th:text="${year}"></option>
</select>
</form>
.. 其中 "command" 是控制器中表单 bean 的名称。
This thread 帮我弄明白了。
为了显示使用 Spring MVC with Thyme Leaf 创建的全局错误,我尝试了 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#global-errors 中给出的示例:
即:
<div th:if="${#fields.hasGlobalErrors()}">
和
<ul th:if="${#fields.hasErrors('global')}">
和
<div th:if="${#fields.hasGlobalErrors()}">
当我将它们添加到我的 HTML 时,页面甚至不会呈现,更不用说提交表单了。所有示例的结果为:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#fields.hasErrors('global')"
我用 v2.1.4 和 v.2.1.3 试过这个,但得到了同样的错误。 Bug 还是我做错了什么?
是的,标签全部闭合且格式正确。是的,这段代码在一个表单中。是的,表单的所有其他方面都可以在没有全局错误检查的情况下工作。
这是破损的简短版本 HTML:
<form action="search.html" th:action="@{/auto/search}">
<p th:if="${#fields.hasErrors('global')}" th:errors="*{global}">
Incorrect date
</p>
<input type="text" th:field="${command.stockNumber}" />
<select th:field="*{command.startYear}">
<option value="" th:each="year : ${modelYears}" th:value="${year}"
th:text="${year}"></option>
</select>
</form>
还有控制器..
@RequestMapping(value = "/auto/search", method = RequestMethod.POST)
public String search(@Validated
@ModelAttribute("command")
AutoSearchCommand autoSearchCommand
BindingResult result, Model model) {
return "search";
}
已解决:
在全局错误检查之前的标记中需要th:object
。不幸的是,Spring 百里香叶 tutorial 中没有提到这一点。据推测,我在我的控制器中覆盖了某处的默认表单名称。
在这个工作中添加标签结果html:
<form action="search.html" th:action="@{/auto/search}">
<div th:object="${command}" th:remove="tag">
<p th:if="${#fields.hasErrors('global')}" th:errors="*{global}">
Incorrect date
</p>
</div>
<input type="text" th:field="${command.stockNumber}" />
<select th:field="*{command.startYear}">
<option value="" th:each="year : ${modelYears}" th:value="${year}"
th:text="${year}"></option>
</select>
</form>
.. 其中 "command" 是控制器中表单 bean 的名称。
This thread 帮我弄明白了。