Не отображаются сообщения об ошибках при проверке с использованием @valid (JSR-303) в Spring MVC

Я указал <mvc:annotation-driven /> в диспетчере-сервлете. Я не использую @InitBinder.
И я использую аннотацию @valid для проверки в методе контроллера, например

@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 ошибки Ошибка поля в объекте 'article' в поле '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] Ошибка поля в объекте 'article' в поле 'title': отклоненное значение []; коды [Size.article.title, Size.title, Size.java.lang.String, Size]; аргументы [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)

Как его настроить, чтобы не генерировать исключение, а вместо этого возвращаться на страницу и показывать сообщения об ошибках ...


person hemal    schedule 16.01.2010    source источник
comment
Как вы включили проверку? Используете @InitBinder на вашем контроллере или <mvc:annotation-driven/> в вашем контексте? Какой бы из них вы ни использовали, добавьте эти биты к своему вопросу.   -  person skaffman    schedule 16.01.2010


Ответы (2)


Вы должны явно решить, что делать с ошибками проверки:

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

В методе обработчика контроллера убедитесь, что аргумент BindingResult находится сразу после аргумента команды.

person Prateek    schedule 02.05.2012
comment
Очень странно, но у меня это тоже сработало. Мне всегда говорили, что Spring может определять параметры метода контроллера самостоятельно, и мне никогда не придется о них беспокоиться! Но это по крайней мере один случай, когда порядок параметров влияет на выполнение! - person Jaywalker; 22.11.2016
comment
Да, BindingResult должен быть размещен сразу после атрибута input (request). У меня тоже сработало. - person Monis; 29.04.2019