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

时间:2010-01-16 11:45:00

标签: java spring spring-mvc bean-validation

我在dispatcher-servlet中指定了<mvc:annotation-driven />。 我没有使用@InitBinder 我在控制器的方法中使用@valid annotation进行验证,如

@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:   请求处理失败;嵌套   例外是   org.springframework.validation.BindException:   org.springframework.validation.BeanPropertyBindingResult:   2个错误对象中的字段错误   字段'urlInfo.url'上的'文章':   拒绝价值[];代码   [typeMismatch.article.urlInfo.url,typeMismatch.urlInfo.url,typeMismatch.url,typeMismatch.java.net.URL,typeMismatch];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码   [article.urlInfo.url,urlInfo.url];   参数[];默认消息   [urlInfo.url]];默认消息   [无法转换属性值   输入'java.lang.String'到必需的   输入'java.net.URL'作为属性   'urlInfo.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':被拒绝的值[];   代码   [Size.article.title,Size.title,Size.java.lang.String,尺寸];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[article.title,title];参数   [];默认消息   [标题],{javax.validation.constraints.Size.message},6,[Ljava.lang.Class; @ 1db3aac,2147483647,[Ljava.lang.Class; @ 1e90abf];   默认消息[大小必须介于两者之间   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)

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

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:16)

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

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