【问题标题】:Enum conversion doesn't fallback to rest-messages枚举转换不会回退到休息消息
【发布时间】:2018-01-24 15:03:27
【问题描述】:

我正在使用 Spring Boot 1.5.8、Spring Data REST、Spring HATEOAS。在我启用的暴露 REST 端点的应用程序中:

spring.data.rest.enable-enum-translation=true

这样,当我要求枚举时,它会根据我的语言环境进行翻译。

更多配置内容:

    @Bean
    public LocaleResolver localeResolver() {
        return new SmartLocaleResolver();
    }

    public class SmartLocaleResolver extends CookieLocaleResolver {
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String acceptLanguage = request.getHeader("Accept-Language");
            if (acceptLanguage == null || acceptLanguage.trim().isEmpty()) {
                return super.determineDefaultLocale(request);
            }
            return request.getLocale();
        }
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:/i18n/messages");
        // messageSource.setDefaultEncoding("UTF-8");
        // set to true only for debugging
        messageSource.setUseCodeAsDefaultMessage(false);
        messageSource.setCacheSeconds((int) TimeUnit.HOURS.toSeconds(1));
        messageSource.setFallbackToSystemLocale(false);
        return messageSource;
    }

    @Bean
    public MessageSourceAccessor messageSourceAccessor() {
        return new MessageSourceAccessor(messageSource());
    }

如您所见,我还设置了消息源以翻译来自服务器的异常。

我的服务器区域设置是 IT,我有 rest-messages.properties(美国翻译)和 rest-messages_it.properties(IT 翻译)。我的目标是在语言无法识别时使用 rest-messages.properties,在语言为 IT 时使用 rest-messages_it.properties

现在它不起作用。当没有所选语言的对应文件时,Spring Data REST 读取 rest-messages_it.properties

我通过使用 messageSource.setFallbackToSystemLocale(false); 的 messages.properties 解决了这个问题。有没有办法对rest-messages 文件做同样的事情?

【问题讨论】:

    标签: spring spring-mvc spring-boot spring-data-rest


    【解决方案1】:

    如果您将RepositoryRestMvcConfiguration 子类化,覆盖并复制其方法resourceDescriptionMessageSourceAccessor,但将fallbackToSystemLocale 设置为false 以获取messageSource,该怎么办?

    @Override
    @Bean
    public MessageSourceAccessor resourceDescriptionMessageSourceAccessor() {
    
        try {
    
            PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
            propertiesFactoryBean.setLocation(new ClassPathResource("rest-default-messages.properties"));
            propertiesFactoryBean.afterPropertiesSet();
    
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:rest-messages");
            messageSource.setCommonMessages(propertiesFactoryBean.getObject());
            messageSource.setDefaultEncoding("UTF-8");
    
            // Adding this line:
            messageSource.setFallbackToSystemLocale(false);
    
            return new MessageSourceAccessor(messageSource);
    
        } catch (Exception o_O) {
            throw new BeanCreationException("resourceDescriptionMessageSourceAccessor", "", o_O);
        }
    }
    

    如果您使用默认语言环境的值创建 rest-default-messages.properties 文件会怎样?..


    来自问题作者的更新

    要保留 spring.data.rest.* 属性,有必要创建一个 RepositoryRestConfiguration Bean,如 post 中所述:

    @Bean
    @ConfigurationProperties(prefix = "spring.data.rest")
    @Override
    public RepositoryRestConfiguration config() {
        return super.config();
    }
    

    【讨论】:

    • 好主意。我建议按照此处github.com/spring-projects/spring-boot/issues/2392 的描述来覆盖 config() 以保留 spring.data.rest.* 属性。这样做了,它工作得很好。我只需要了解为什么 java.time.Instant 没有转换为 ISO8601 日期,而是在没有此配置的情况下发生。谢谢
    • @drenda 你怎么看安迪威尔金森comment?没看懂。。
    • 我也很难理解这一点。我看了一下 RepositoryRestConfigurer 但它是一个接口,我应该实现所有方法。此外,我在 RepositoryRestMvcConfiguration 中看不到任何评论。
    • @drenda 我想我现在猜 - 他刚刚确认了我们应该创建一个 Bean,如 example 所示))
    • 是的,我已经这样做了,以保留 spring.data.rest。* 也许我在之前的评论中解释得很糟糕,但是没有足够的空间来编写标记良好的代码。因此,可以肯定的是,我建议您在回复中添加该内容。最后不是,正如我写的那样,那个bean java.time.Instant 也没有转换成ISO8601。如果我弄清楚如何解决以及没有此特定配置的原因,我会发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2016-04-24
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多