【问题标题】:Read ValidationMessages encoded in utf-8读取以 utf-8 编码的 ValidationMessages
【发布时间】:2020-12-19 00:40:38
【问题描述】:

如何更改验证消息的资源包?默认的是读取我的 ValidationMessages.properties 为 ISO-8859-1(我猜),但它是 UTF-8。我试过这个:

@Configuration
@EnableWebMvc
@ComponentScan
public class ApplicationConfiguration extends WebMvcConfigurerAdapter{

    @Bean( name = "messageSource" )
    public ReloadableResourceBundleMessageSource validationMessageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("ValidationMessages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean();
        validatorFactoryBean.setValidationMessageSource(validationMessageSource());
        return validatorFactoryBean;
    }

    @Override
    public Validator getValidator() {
        return validator();
    }

无论我在这里放什么,Hibernate 都不会使用它来获取消息。 有小费吗? 我正在使用 Hibernate 5 和 Spring 4。

【问题讨论】:

  • 你确定它没有使用“UTF-8”吗?您可以在运行时致电messageSource.getDefaultEncoding() 并仔细检查吗?

标签: java spring hibernate hibernate-validator spring-4


【解决方案1】:

.properties 文件是按照规范以ISO-8859-1 编码读取的(又名Latin-1。(参见https://en.wikipedia.org/wiki/.propertiesHow to use UTF-8 in resource properties with ResourceBundle)。因此您需要指定Unicode 字符而不是将文件另存为UTF-8 .

要将LocalValidatorFactoryBean 与Hibernate 一起使用,您需要将其连接到JPA,否则它将使用默认值。

将以下属性添加到 LocalContainerEntityManagerFactoryBean 的 JPA 属性中。

<entry key="java.persistence.validation.factory" value-ref="validator" />

添加它会使其使用 Spring 配置的实例。

【讨论】:

    【解决方案2】:
        @Bean
        public MessageSource validationMessageResource() {
            ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
            messageSource.setBasename("ValidationMessages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        @Bean
        public Validator validator() {
            return Validation.byDefaultProvider()
                    .configure()
                    .messageInterpolator(
                            new ResourceBundleMessageInterpolator(
                                    new MessageSourceResourceBundleLocator(validationMessageResource())
                            )
                    )
                    .buildValidatorFactory()
                    .getValidator()
                    ;
        }
    

    【讨论】:

      【解决方案3】:

      使 UTF-8 工作的一个选项是使用 java 类而不是属性文件。

      只需将 ValidationsMessages.java、ValidationMessages_fi.java 等添加到您的 src 文件夹根目录。

      public class ValidationMessages extends ListResourceBundle {
      
      @Override
      protected Object[][] getContents() {
          return new Object[][] { 
              { "user.name", "Name is not valid" } 
          };
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2013-07-04
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 2015-08-13
        • 1970-01-01
        • 2019-12-27
        • 2017-08-29
        相关资源
        最近更新 更多