java - 带有 :errors tag 形式的 Spring JSR-303

标签 java spring jsp spring-mvc

我正在尝试使用 JSR-303 验证并在 jsp 页面中显示它的结果。这是显示错误的 jsp 页面代码片段:

<c:set var="Error">
    <form:errors path="name"/>
</c:set>
...
<spring:transform value="${Error}"/>

在 Controller 中我有以下内容:

@PostMapping(params = "next")
public String next(@Valid @ModelAttribute(COMMAND_NAME) final ProjectNewDetailsCommand cmd,
                   final Errors errors,
                   final Model model,
                   final HttpServletRequest request) {

首先,对我有用的解决方案是编写自定义 Validator 类:

@Override
public void validate(Object o, Errors errors) {
    errors.pushNestedPath("project");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "error.project.creation.name.required");
    errors.popNestedPath();
}

在这种情况下,来自 messages.properties 的适当消息被应用并显示在 UI 上:

error.project.creation.name.required=The name must not be blank.

这是我使用 JSR-303 注解的另一种情况:

public class Project {

    ...
    @Size(max = 100, message = "error.project.creation.size")
    private String name;

messages.properties 中,键 error.project.creation.size 下有消息,我还尝试使用键 Size 添加消息.command.project.name 正如某些来源中所述。 Error Controller 中的对象也不为空并且包含验证错误。但是,当我将此方法与 JSR-303 一起使用时,出现以下错误:

Caused by: javax.servlet.jsp.JspTagException: No message found under code 'Size' for locale 'en_US'.
    at org.springframework.web.servlet.tags.MessageTag.doEndTag(MessageTag.java:200)

这意味着出于某种原因 Spring 尝试应用 Size 错误代码而不是 error.project.creation.size Size.command.project.name.知道为什么会发生这种情况以及如何解决这个问题吗?

最佳答案

终于找到了问题的根源。在渲染警报的代码中,有一个 spring:message 标签:

<spring:message code="${error.code}" arguments="${error.arguments}"/>

If 以下列方式工作:它从 Errors 类中的 codes 数组中查找最后的代码(参见 DefaultMessageSourceResolvable.getCode 方法),这就是它不能的原因找到 Size 消息,但没有找到由 hibernate validator 或自定义 validator 创建的 defaultMessage

在这种情况下,简单的解决方法是添加 text 属性:

<spring:message code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/>

关于java - 带有 :errors tag 形式的 Spring JSR-303,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43093120/

相关文章:

javascript - 如何访问javascript函数中的java变量

javascript - 加载 bootstrap 4 css 时,侧边栏导航折叠显示空白屏幕

mysql - 当类具有 jdbc servlet jsp mysql 中另一个类的外键时,如何列出类的所有元素?

java - 创建在类路径资源 Spring/Hibernate 中定义的名称为 'sessionFactory' 的 bean 时出错

java - 如何使用 Spring + iBatis 解决我的应用程序中的设计问题

java - 为什么我的@RestController 中接收到的实体将值设置为 null 而不是默认值

java - 将 JSP webview 页面转换为 React Native 格式

java - 从用户扫描器类获取输入

Java:使用异步编程优化应用程序

java - 如何以正确的方式对字符进行编码和解码