Spring MVC Hibernate Validator TypeMismatch Exception
Я использую Spring MVC с валидатором Hibernate 4.2.0. У меня есть ValidationMessages.properties в моем пути к классам в /WEB-INF/classes/ValidationMessages.properties:
typeMismatch.java.lang.Integer=Must specify an integer value.
typeMismatch.int=Invalid number entered
typeMismatch=Invalid type entered
Это сделано доступным как bean в javaconfig:
@Configuration
@EnableWebMvc
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter {
...
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource resourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
resourceBundleMessageSource.setBasename("ValidationMessages");
return resourceBundleMessageSource;
}
...
который загружает ValidationMessages.properties из пути к классу нормально. Мой контроллер:
@Controller
public class myController {
...
@InitBinder("myForm")
protected void initUserBinder(WebDataBinder binder) {
binder.setValidator(new CustomValidator());
}
...
@ResponseBody
@RequestMapping(value = "/ajax/myRequest", method = RequestMethod.POST)
public CustomResponse ProcessAjaxRequest(
@Valid @ModelAttribute final MyForm myForm,
final BindingResult bindingResult)
throws Exception {
if (bindingResult.hasErrors()) {
return new CustomResponse(bindingResult.getAllErrors());
} else {
..
}
}
...
И пользовательский валидатор:
public class CustomValidator implements Validator {
@Override
public boolean supports(Class c) {
return MyForm.class.equals(c);
}
@Override
public void validate(Object obj, Errors errors) {
..
Проверка с помощью CustomValidator работает нормально (я вставляю сообщения об ошибках вручную, не используя источник сообщений), однако для привязки ошибок типа Несоответствие я получаю исключение:
Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'myField'; nested exception is java.lang.NumberFormatException: For input string: "A"
а не код из ValidationMessages.properties, поэтому похоже, что DataBinder (?) не использует мой messageSource. Мне нужны коды typeMismatch из моего файла свойств, а не сообщение об исключении. Я также попытался с ResourceBundleMessageSource вместо ReloadableResourceBundleMessageSource, но это не имело никакого значения. Есть идеи?
1 ответ
Как вы получаете сообщение об ошибке? Это работа для вас?
@Autowired
private MessageSource messageSource;
...
FieldError error = bindingResult.getFieldError("fieldName");
String errorMessage = messageSource.getMessage(error, Locale.getDefault());