2010-11-17 65 views
8

在Spring中,经过验证,我们在controller中得到一个BindingResult对象。Spring:如何解决验证错误 - >错误代码 - >错误信息

足够简单,如果我得到验证错误,我想重新显示我的表单,并在每个受影响的字段上方显示错误消息。

所以检查领域错误的现场usernameFormObject我打电话:

FieldError usernameFieldError = bindingResult.getFieldError("username"); 

太好了,现在我持有FieldError物体,假设我使用的DefaultMessageCodeResolver现在包含类似4个可能的错误码。

我该如何从FieldError - >一个字符串是消费者可以使用的?

我在我的web应用上下文中定义了MessageSource,所以我可以将单个错误代码映射到消息。

但有时默认的信息会最好,有时候我希望两个错误代码可能有相关的信息,所以我们需要选择最好的信息。

使用什么方法来确定最佳可能出现的错误消息以显示字段错误?

  • 我是否需要编写一些算法来检查所有的错误代码,并从最具体的?
  • 春天是否提供任何帮助确定最具体的错误信息?
  • 整个过程看起来如此漫长和复杂,我认为春天应该让这件事变得容易。也许我完全脱离基地?

回答

15

正如你所猜测的那样,你对自己的方式比自己的方式要难。 FieldError对象本身就是MessageSourceResolvable。您不需要取回代码,然后手动将单个代码添加到您的消息源并查找。您可以将它传递到MessageSource,它会找到最具体的一个,它在您的语言环境中定义了一个翻译。 (假设你的代码解析器把它们放在正确的顺序)

你真的甚至不需要在大多数情况下,但是。将Errors放在您的支持对象上并自行翻译它通常不是必需的。 jsp库中的form名称空间提供了一个标记,可以为您查找错误消息。您只需将Errors放入ModelMap即可。见文档:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/view.html#view-jsp-formtaglib-errorstag

+0

哦,我明白了,我没赶上MessageSource.get(MessageSoureResolvable,...),我只注意到了get(字符串,...)选项,这是关键环节(实际上我可能已经注意到了,并且在学习新的框架/ API时,我们迷失了无数的细节)。谢谢!! – 2010-11-17 08:20:00

+0

关于JSP taglib的有趣点,我正在使用Velocity,但Spring提供了宏的形式。但我还没有使用它,因为它似乎相当反春天,即使我的视图呈现与春季框架。我认为我的控制器现在调用Spring特定的MessageSource而不是Java标准的Res​​ourceBundle已经够糟糕了。但是,也许我正在推翻它?这是我第一次与春天。 – 2010-11-17 08:22:29

+1

确实如此,但就视图技术而言,通常最终会与*相关联。*如果您尝试仅使用JSTL和servlet API,那么您会做很多重新发明! WebMVC和WebFlow是非侵入性的,使用标签库,您可以很容易地创建自己的.tag文件来包装它们,并将依赖关系“隔离”到稍后可以更改实现的单个位置。使用标签还可以消除对后台对象中Errors接口的依赖,使您可以使用无弹簧的pojo。 – Affe 2010-11-17 18:12:51