如何使用 spring 3 mvc 和 hibernate 验证器在 jsp 中返回自定义消息(jsr303)
我有一个使用 spring 3 mvc 和 hibernate 验证器来验证表单对象的项目。
我遵循 spring 的 文档
在我的控制器中,我可以获得绑定结果,其中 bindingresult.hasErrors() == true
。
我使用 ReloadableResourceBundleMessageSource
进行错误消息绑定。
我的问题是: 我的jsp网页中是否可以有更灵活的错误信息显示?
例如,我想说“应用程序名称 UserEnteredAppName 无效。大小应在 2 和 255 之间”。
在我的 message.property 中,我定义:
Size.appNameForm.itemName=the app name {What Should I do in this brace?} is not valid. The size should be between {1} and {2}
{1} 和 {2} 可以插值为“2”和“255”。但如何获取内插消息中的 UserEnteredAppName ?
下面是我的表单类和控制器类:
我的控制器类:
@RequestMapping(value="foo.htm")
public String handleAppNameFormSubmit(@Valid @ModelAttribute("appNameForm") AppNameForm form, BindingResult result){
}
我的表单类:
public class AppNameForm implements IForm{
@NotEmpty
@Size(min = 1, max = 255)
private String itemName;
....
}
我发现一些链接给了我一些提示:
例如: 如何使用 Hibernate Validator 动态解析消息参数?
但我正在使用 spring mvc 和 spring controll要使用 jsr303 实现,我找不到使用自定义验证器的方法,扩展 hibernate 的默认 ValidatorImpl。
我认为解决方案是,我可以拥有自定义验证器,它将拒绝将 UserEnteredAppName 放入绑定结果中。是否可以?或者我应该寻找另一种方式?
谢谢 安德鲁
I have a project using spring 3 mvc and hibernate validator to validate form object.
I follow spring's document
In my controller, I can get bindingresult, which bindingresult.hasErrors() == true
.
I use ReloadableResourceBundleMessageSource
to do the error message binding.
And my question is:
Is it possible that I can have a more flexible error message display in my jsp web page?
For example, I want to say "the app name UserEnteredAppName is not valid. The size should be between 2 and 255".
In my message.property, I define:
Size.appNameForm.itemName=the app name {What Should I do in this brace?} is not valid. The size should be between {1} and {2}
{1} and {2} can be interpolated to '2' and '255'. but how can I get the UserEnteredAppName in the interpolated message?
Below is my form class and controller class:
My controller class:
@RequestMapping(value="foo.htm")
public String handleAppNameFormSubmit(@Valid @ModelAttribute("appNameForm") AppNameForm form, BindingResult result){
}
My form class:
public class AppNameForm implements IForm{
@NotEmpty
@Size(min = 1, max = 255)
private String itemName;
....
}
I find some links which give me some hint:
for example: How do I dynamically resolve message parameters with Hibernate Validator?
But I am using spring mvc and spring controll which jsr303 implementation to use, I cant find a way to use custom validator, extending hibernate's default ValidatorImpl.
What I am thinking the solution is, I can have custom validator, which will reject the UserEnteredAppName into the bindingResult. is it possible? or I should find another way?
Thanks
Andrew
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从 4.2 版开始,Hibernate Validator 提供了 ValueFormatterMessageInterpolator,一个新的消息插值器,应该可以满足您的要求。
通过该插值器,您可以使用占位符
${validatedValue}
引用经过验证的值。您还可以指定格式字符串像这样应用:${validatedValue:[格式字符串]}
,例如,如果验证值是日期,则${validatedValue:%1$ty}
。使用此插值器的示例可以在 Hibernate Validator 参考指南。
As of release 4.2 Hibernate Validator provides ValueFormatterMessageInterpolator, a new message interpolator which should fulfill your requirements.
With that interpolator you can refer to the validated value using the place holder
${validatedValue}
. You can also specify a format string to be applied like this:${validatedValue:[format string]}
, e.g.${validatedValue:%1$ty}
if the validated value is a date.An example for using this interpolator can be found in the Hibernate Validator reference guide.