【发布时间】:2017-12-23 11:54:55
【问题描述】:
我正在尝试编写自定义 bean 验证器并根据用户界面上的区域设置显示验证消息。
为此,我创建了一个如下所示的验证器:
@Component
public class MyCustomValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return MyClass.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
MyClass myObject = (MyClass)target;
if (StringUtils.isBlank(myObject.getName())) {
errors.rejectValue("name", "{myproject.myclass.validation.name});
}
}
}
我还注册了 messageSource 和验证器 bean:
@Configuration
@ComponentScan(basePackages = "com.mycompany.myproject")
public class MyProjectWebMvcConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.addBasenames("locale/myproject");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(this.messageSource());
return validator;
}
}
在我的控制器中,我使用 initBinder 来注册我的验证器:
@RestController
@RequestMapping("/api/mytype")
public class MyController extends MyBaseController {
@Autowired
private MyCustomValidator myCustomValidator;
@InitBinder
protected void initBinder(WebDataBinder binder) {
super.initBinder(binder);
binder.addValidators(this.myCustomValidator);
}
@PostMapping(value = "/")
public ResponseEntity<OperationResult<Void>> save(@Valid @RequestBody MyClass myObject, BindingResult bindingResult, HttpServletRequest request) {
if (!bindingResult.hasErrors()) {
...
}
...
}
}
public class MyBaseController {
@Autowired
protected Validator validator;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
}
}
不过,验证错误消息仍会在用户界面上显示为 {myproject.myclass.validation.name}。即使我设置了LocalValidatorFactoryBean 的验证消息源,似乎也没有从 messageSource 读取消息。
另一方面,如果我使用@NotNull(message = {myproject.myclass.validation.name}) 注释而不是使用自定义验证器,验证错误消息会正确显示。
无法弄清楚我错过了什么。
【问题讨论】:
-
我遇到了同样的问题,请问您是如何解决的?
标签: java validation spring-mvc spring-boot bean-validation