枚举转换不会回退到休息消息

时间:2018-01-24 15:03:28

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

我使用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文件做同样的事情?

1 个答案:

答案 0 :(得分:0)

如果您继承RepositoryRestMvcConfiguration,覆盖并复制其方法resourceDescriptionMessageSourceAccessor,但为false设置 fallbackToSystemLocale 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。*属性,必须按照post中的描述创建RepositoryRestConfiguration Bean:

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