在春季 MVC 中使用 @valid(JSR-303) 进行验证时未显示错误消息

2022-09-03 17:41:59

我已经在调度程序-servlet 中指定了。我没有使用@InitBinder。
我正在使用@valid注释在控制器的方法中进行验证,例如<mvc:annotation-driven />

@RequestMapping(method = RequestMethod.POST, value = "new")
    public String save(@Valid Article article,ModelMap model) {
//code here
}

验证工作正常,但不是在 ..在 html 代码中显示的示例

<tr>
         <td>Title</td>
         <td><form:input path="title"/></td>
         <td><form:errors path="title"/></td>
</tr>

它抛出异常,如..

org.springframework.web.util.NestedServletException: Request processing failed;嵌套异常是 org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors 字段 'urlInfo.url' 上对象 'article' 中的字段错误: rejected value [];codes [typeMismatch.article.urlInfo.url,typeMismatch.urlInfo.url,typeMismatch.url,typeMismatch.java.net.URL,typeMismatch];arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [article.urlInfo.url,urlInfo.url]; arguments []; default message [urlInfo.url]];默认消息 [未能将属性 'urlInfo.url' 的类型 'java.lang.String' 的属性值转换为必需类型 'java.net.URL'; 嵌套异常是 org.springframework.core.convert.ConversionFailedException: 无法将值从类型 'java.lang.String' 转换为类型 'java.net.URL'; 嵌套异常是 org.springframework.core.convert.ConversionFailedException: 无法将值从类型 'java.lang.String' 转换为类型 'java.net.URL';嵌套异常是 java.lang.reflect。InvocationTargetException] 字段“title”上对象“article”中的字段错误:拒绝值 [];codes [Size.article.title,Size.title,Size.java.lang.String,Size];arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [article.title,title]; arguments []; default message [title],{javax.validation.constraints.Size.message},6,[Ljava.lang.Class;@1db3aac,2147483647,[Ljava.lang.Class;@1e90abf]; 默认消息 [size 必须介于 6 和 2147483647] 之间]

 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
 org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
 org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
 org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
 org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
 org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
 org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

如何配置它,不引发异常,而是返回页面并显示错误消息...


答案 1

在控制器处理程序方法中,请确保 BindingResult 参数紧跟在命令参数之后。


答案 2

您应该明确决定如何处理验证错误:

@RequestMapping(method = RequestMethod.POST, value = "new") 
public String save(@Valid Article article, BindingResult result, ModelMap model) { 
    if (result.hasErrors())
        return "formView";

推荐