Hoà*_*ong 11 java validation spring spring-mvc
我是春季新手.
我在我的域类中设置了验证,如下所示:
public class Worker {
@NotNull(message="Name must be input")
@Size(min=1,max=50, message="Name must not exceed 50 characters")
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
这是jsp文件:
<form:input path="code" readonly="false" />
<font color="red"><form:errors path="code" />
Run Code Online (Sandbox Code Playgroud)
和控制器代码:
@RequestMapping(value="/test",method=RequestMethod.POST)
public void form(@Valid Worker worker, BindingResult result) {
if (result.hasErrors()) {
return;
}
...
Run Code Online (Sandbox Code Playgroud)
它有效,但如何在我的messageSource中用一些文本(如worker.name.overflow)替换"名称不能超过50个字符"?我可以在BindingResult中添加一个messageResolver吗?
所有搜索结果似乎都是关于编写自定义Validator类的,但我现在想要使用注释.我很确定有办法,因为在这个问题上有人这样做了.
Aff*_*ffe 18
告诉hibernate验证器对代码进行查找,将消息的值放在大括号中.例如,@NotNull(message="{worker.name.NotNull}"然后将转换放在类路径根目录中的ValidationMessages.properties中.(/ WEB-INF/classes,maven中的资源文件夹等)
验证器实现独立地查找它们,并且它们继续将BindingResult转换为默认消息.发生在Spring消息源之外.理论上,您可以覆盖LocalValidatorFactory bean,将验证器的消息输出作为代码放到Errors对象上,然后在注释中保留大括号,以便Hibernate Validator传递它.将JSR-303 ConstraintViolations转换为弹簧错误的源代码非常简单,可以读取和扩展.它只是将注释的名称作为代码,注释属性作为args,然后将验证器的转换作为默认消息.
可以在这里看到: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
小智 5
这是对问题的一点解释。
@Size(min = 1, max = 50, message = "Email size should be between 1 and 50")
Run Code Online (Sandbox Code Playgroud)
现在从验证标签中删除 { message = "Email size should be between 1 and 50" }。
执行此操作后,您的注释将是这样的。
@Size(min = 1, max = 50)
Run Code Online (Sandbox Code Playgroud)
现在在控制器端调试提交表单时调用的方法。下面是我的方法,它在用户点击提交时接收请求。
public static ModelAndView processCustomerLoginRequest(IUserService userService, LoginForm loginForm,
HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map<String, LoginForm> model)
Run Code Online (Sandbox Code Playgroud)
现在在方法的第一行放置一个调试点并调试参数“result”。
BindingResult result
Run Code Online (Sandbox Code Playgroud)
在调试时,您会在代码数组中找到这样的字符串。
Size.loginForm.loginId
Run Code Online (Sandbox Code Playgroud)
现在在您的属性文件中定义此字符串并针对该字符串定义一条消息。编译并执行。每当该注释未被验证时,就会显示该消息。
Size.loginForm.loginId=email shouldn't be empty.
Run Code Online (Sandbox Code Playgroud)
基本上,spring 将自己的字符串作为其属性文件消息的键。在上面的键
Size(@Size) = validation annotation name
loginForm = My Class Name
loginId = Property name in LoginForm class.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30278 次 |
| 最近记录: |