如何在Spring中使用批注验证,并从属性文件中获取错误消息?
问题内容:
我是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)替换“名称不能超过50个字符”?我是否需要将messageResolver添加到BindingResult中?
所有搜索结果似乎都是关于编写自定义Validator类的,但是我现在想使用注释。我很确定有办法,因为在这个问题上有人做到了。
问题答案:
要告诉hibernate验证器对代码进行查找,请将message的值放在大括号中。例如,@NotNull(message="{worker.name.NotNull}"
然后将转换内容放在类路径根目录的ValidationMessages.properties中。(/
WEB-INF / classes,maven中的资源文件夹,等等。)
验证器实现独立地查找它们,它们继续在已转换为默认消息的BindingResult上进行。发生在Spring消息源之外。从理论上讲,您可以重写LocalValidatorFactory
bean,以将验证器的消息输出作为代码放置到Errors对象上,然后将括号保留在批注中,以便Hibernate Validator使其通过。将JSR-303
ConstraintViolations转换为spring
Errors的源代码非常容易阅读和扩展。它只是将注释的名称作为代码,将注释的属性作为args,然后将验证程序的翻译作为默认消息。
- 可以在这里查看:[https]( https://src.springframework.org/svn/spring-
- framework/trunk/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java)
-
//src.springframework.org/svn/spring-
framework/trunk/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java
编辑评论中的问题:
您可以在其中添加一个javax.validation.MessageInterpolator
,javax.validation.Configuration
以告诉它在其他属性文件中查找消息。如果您使用的是Spring
LocalValidatorFactory bean,则上面有一个setMessageInterpolator,您可以使用它来注入一个。
对于hibernate,提供程序实现为:http
:
//docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/messageinterpolation/ResourceBundleMessageInterpolator.html