如何在Spring中使用注释validation,并从属性文件中获取错误消息?

我是spring的新手。

我在我的域类中设置了validation,如下所示:

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文件:

 

和控制器代码:

 @RequestMapping(value="/test",method=RequestMethod.POST) public void form(@Valid Worker worker, BindingResult result) { if (result.hasErrors()) { return; } ... 

它有效,但如何在我的messageSource中用一些文本(如worker.name.overflow)替换“名称不能超过50个字符”? 我可以在BindingResult中添加一个messageResolver吗?

所有搜索结果似乎都是关于编写自定义Validator类的,但我现在想要使用注释。 我很确定有办法,因为在这个问题上有人这样做了。

告诉hibernatevalidation器对代码进行查找,将消息的值放在大括号中。 例如, @NotNull(message="{worker.name.NotNull}"然后将转换放在类路径根目录中的ValidationMessages.properties中。(/ WEB-INF / classes,maven中的resources文件夹等)

validation器实现独立地查找它们,并且它们继续将BindingResult转换为默认消息。 发生在Spring消息源之外。 理论上,你可以覆盖LocalValidatorFactory bean,将validation器的消息输出作为代码放到Errors对象上,然后在注释中保留大括号,以便Hibernate Validator传递它。 将JSR-303 ConstraintViolations转换为spring错误的源代码非常简单,可以读取和扩展。 它只是将注释的名称作为代码,注释属性作为args,然后将validation器的转换作为默认消息。

可以在这里看到: https : //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

这是对问题的一点解释。

 @Size(min = 1, max = 50, message = "Email size should be between 1 and 50") 

现在从validation标记中删除{message =“电子邮件大小应在1到50之间”}。

执行此操作后,您的注释将如下所示。

 @Size(min = 1, max = 50) 

现在在控制器端调试提交表单时调用的方法。 以下是我在用户点击提交时接收请求的方法。

 public static ModelAndView processCustomerLoginRequest(IUserService userService, LoginForm loginForm, HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map model) 

现在将调试点放在方法的第一行并调试参数“result”。

 BindingResult result 

在dubugging你会在代码数组中找到这样的字符串。

 Size.loginForm.loginId 

现在在属性文件中定义此字符串,并在该字符串中定义消息。 编译并执行。 只要不validation该注释,就会显示该消息。

 Size.loginForm.loginId=email shouldn't be empty. 

基本上spring将自己的字符串作为其属性文件消息的键。 在上面的关键

 Size(@Size) = validation annotation name loginForm = My Class Name loginId = Property name in LoginForm class.