【发布时间】:2015-01-15 18:26:11
【问题描述】:
@Valid 注释为什么不能原生捕获我的 JSR-303 注释,但使用以下方法捕获它们:
WebConfig.java
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
String[] strBaseNames = {
"resources.messages.layout.LayoutResources",
"resources.messages.layout.MenuResources",
"resources.messages.global.GlobalResources"
};
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setBasenames(strBaseNames);
return messageSource;
}
@Bean
public LocalValidatorFactoryBean jsr303Validator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(this.messageSource());
return localValidatorFactoryBean;
}
UserController.java
@Controller
@RequestMapping(value = "/security/user", method = RequestMethod.GET)
public class UserController {
@Autowired
private SecurityService securityService;
@Autowired
SessionObject sessionObject;
@Autowired
@Qualifier("jsr303Validator") Validator validator;
@RequestMapping(value = "/edit/validate", method = RequestMethod.POST)
public String validateEdit( @ModelAttribute @Valid User user,
BindingResult result,
Model model) {
String strViewName = "common/error";
validator.validate(user, result);
if(result.hasErrors()) {
strViewName = "user/userEdit";
} else {
... update work ...
strViewName = "user/success";
}
return strViewName;
}
如果我只使用@Valid 注释,result.hasErrors() 总是空的,所以我最终会遇到预期的 ConstraintViolationException(见下文)。但我希望它只使用 @Valid 注释来工作,而不必在我想要实现一些 JSR-303 验证的每个控制器中自动装配我的 jsr303validator bean。
约束违规日志跟踪
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [spring4base.model.security.User] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='error.firstname.notnull', propertyPath=strFirstName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.firstname.notnull'}
ConstraintViolationImpl{interpolatedMessage='error.userid.notnull', propertyPath=strUserId, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.userid.notnull'}
ConstraintViolationImpl{interpolatedMessage='error.lastname.notnull', propertyPath=strLastName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.lastname.notnull'}
]
User.java
@NotBlank(message = "error.userid.notnull")
@Size(min = 0, max = 14, message = "error.firstname.length")
private String strUserId = "";
@NotBlank(message = "error.firstname.notnull")
@Size(min = 0, max = 50, message = "error.firstname.length")
private String strFirstName = "";
@NotBlank(message = "error.lastname.notnull")
@Size(min = 0, max = 50, message = "error.lastname.length")
private String strLastName = "";
谢谢
【问题讨论】:
-
你解决过这个问题吗?
-
是的,马上发布解决方案。
标签: spring spring-mvc bean-validation