我无法使用Spring MVC 4.2.5.RELEASE工作hibernate验证5.1.0.Final。Spring 4&Hibernate 5验证器messageSource不起作用
我的WebConfig:
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
}
@Bean
@Autowired
public MethodValidationPostProcessor getValidationPostProcessor(LocalValidatorFactoryBean validator) {
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
processor.setValidator(validator);
return processor;
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
@Override
public Validator getValidator() {
return validator();
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
LocaleChangeInterceptor l = new LocaleChangeInterceptor();
l.setParamName("lang");
return l;
}
@Bean
public SessionLocaleResolver localeResolver(){
SessionLocaleResolver s = new SessionLocaleResolver();
s.setDefaultLocale(Locale.ENGLISH);
return s;
}
我有一个ExceptionHanlder它得到验证信息并推回一个JSON:
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public ValidationError handleConstraintViolation(final ConstraintViolationException exception) {
ValidationError v = new ValidationError();
exception.getConstraintViolations().forEach(violation -> {
v.addError(violation.getPropertyPath().toString(), violation.getMessage());
});
logger.warn(exception, exception);
return v;
}
我在SRC 3个文件/主/资源/国际化/ :messages_en_EN.properties,messages_pl_PL.properties,messages.properties。 我的模型验证类有一个生效的参数:
@Column(name = "VALUE_", nullable = false)
@Email(message = "{Email.contractorContactEmail.value}")
@NotNull(message = "{NotNull.contractorContactEmail.value}")
private String value;
我看到的是,Hibernate验证一下到类路径:ValidationMessages性能不进我的春消息源。对我来说可能没问题,但Hibernate不想翻译这些消息 - 语言环境始终是服务器默认设置。我究竟做错了什么??我该如何解决它?
PS。在控制器中,我使用@ org.springframework.validation.annotation.Validated。
PS2。我相信我的messageSource工作正常,因为如果我将这段代码添加到ExceptionHandler中,它将完美翻译,但我知道这是不好的做法。
exception.getConstraintViolations().forEach(violation -> {
String messageTemplate = violation.getMessageTemplate();
if (messageTemplate.startsWith("{") && messageTemplate.endsWith("}")) {
String key = StringUtils.substring(messageTemplate, 1, messageTemplate.length() - 1);
v.addError(violation.getPropertyPath().toString(), messageSource.getMessage(key, null, LocaleContextHolder.getLocale()));
}
});
OPS抱歉,我的错误。我的消息在src/main/resources/i18n。 – Gazeciarz
我与它战斗了3天,不能配置它......我想如果它可能是与春季4和休眠验证5之间的集成问题?我正在使用jboss作为Web应用程序服务器..也许它可能有帮助吗?也许我错过了一些罐子?我不知道。 – Gazeciarz
不,如果你的消息配置正确,那么我猜MVC没有正确地拾取LocalValidatorFactoryBean。你可以尝试在你的配置类中添加一个@Autowired private LocalValidatorFactoryBean验证器字段,并从getValidator()返回字段值吗? –