2016-08-01 38 views
2

我无法使用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())); 
      } 
}); 

回答

0

我可以告诉你,远离你的配置来看,你的消息是在错误的地方 - 你已经配置了消息来源看i18/messages但你的消息是在类路径的根。因此,您的消息源定义应如下所示:

@Bean 
public MessageSource messageSource() { 
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
    messageSource.setBasename("messages"); 
    messageSource.setDefaultEncoding("UTF-8"); 
    messageSource.setUseCodeAsDefaultMessage(true); 
    return messageSource; 
} 

除此之外,其余配置看起来几乎没问题。我猜你正在使用WebMvcConfigurerAdapter类?

编辑: 对于未来的读者参考,这个问题并没有配置相关,JPA实体缺少一个@OneToMany领域@Valid注解所以控制器级验证失败,把它捡起来,并Hibernate的JPA验证使用默认的邮件。

+0

OPS抱歉,我的错误。我的消息在src/main/resources/i18n。 – Gazeciarz

+0

我与它战斗了3天,不能配置它......我想如果它可能是与春季4和休眠验证5之间的集成问题?我正在使用jboss作为Web应用程序服务器..也许它可能有帮助吗?也许我错过了一些罐子?我不知道。 – Gazeciarz

+0

不,如果你的消息配置正确,那么我猜MVC没有正确地拾取LocalValidatorFactoryBean。你可以尝试在你的配置类中添加一个@Autowired private LocalValidatorFactoryBean验证器字段,并从getValidator()返回字段值吗? –