java如何在Spring中使用注释验证,并从属性文件获取错误消息?
我是个新手
我在我的域类中设置验证,如下所示:
public class Worker {
@NotNull(message="Name must be input")
@Size(min=1,max=50, message="Name must not exceed 50 characters")
private String name;
...
}
以下是jsp文件:
<form:input path="code" readonly="false" />
<font color="red"><form:errors path="code" />
以及控制器代码:
@RequestMapping(value="/test",method=RequestMethod.POST)
public void form(@Valid Worker worker, BindingResult result) {
if (result.hasErrors()) {
return;
}
...
它可以工作,但是我如何在我的messageSource中用一些文本(比如worker.Name.overflow)替换“Name不能超过50个字符”?我需要在BindingResult中添加messageResolver吗
所有的搜索结果似乎都是关于编写自定义验证器类的,但我现在想使用注释。我很肯定有办法,因为在this question有人这样做了
# 1 楼答案
要让Hibernate validator查找代码,请将消息的值放在大括号中,例如
@NotNull(message="{worker.name.NotNull}"
,然后将翻译放在ValidationMessages中。类路径根目录中的属性(/WEB-INF/classes,Maven中的resources文件夹,等等)验证器实现会独立地查找这些消息,它们会继续执行已翻译为默认消息的BindingResult。发生在Spring消息源之外。理论上,您可以重写LocalValidatorFactorybean,将验证器的消息输出作为代码放到Errors对象上,然后在注释中去掉大括号,以便Hibernate验证器将其传递出去。将JSR-303 ConstraintViolations转换为Spring错误的源代码非常简单,可以读取和扩展。它只是将注释的名称作为代码,注释属性作为args,然后验证程序的翻译作为默认消息。您可以阅读实现here
您可以在
javax.validation.MessageInterpolator
中添加一个javax.validation.Configuration
,告诉它在其他属性文件中查找消息。如果您使用的是Spring LocalValidatorFactory bean,那么它上面有一个setMessageInterpolator()
,可以用来注入一个。检查this源代码以获取Hibrate提供程序实现# 2 楼答案
这是对问题的一点解释
现在从验证标签中删除{message=“电子邮件大小应该在1到50之间”
完成此操作后,您的注释将如下所示
现在在控制器端调试提交表单时调用的方法。下面是我的方法,当用户点击提交时接收请求
现在在方法的第一行放置一个调试点,并调试参数“result”
在dubugging时,你会在codes数组中找到这样的字符串
现在在属性文件中定义这个字符串,并根据该字符串定义一条消息。编译并执行。每当该注释无法验证时,就会显示该消息
基本上,spring将自己的字符串作为其属性文件消息的键。在上面的键中