枚举转换不会回退到 rest-messages
Enum conversion doesn't fallback to rest-messages
我正在使用 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-IT,我有 rest-messages.properties
(美国翻译)和 rest-messages_it.properties
(IT 翻译)。我的目标是在无法识别语言时使用 rest-messages.properties
,在 IT 语言时使用 rest-messages_it.properties
。
现在它不起作用。 Spring 当所选语言没有对应文件时,REST 读取 rest-messages_it.properties
数据。
我用 messages.properties 使用 messageSource.setFallbackToSystemLocale(false);
解决了这个问题。有没有办法对 rest-messages
个文件做同样的事情?
如果您将 RepositoryRestMvcConfiguration
子类化,重写并复制其方法 resourceDescriptionMessageSourceAccessor
,但将 fallbackToSystemLocale 设置为 false
for [=15],会怎样? =]?
@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();
}
我正在使用 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-IT,我有 rest-messages.properties
(美国翻译)和 rest-messages_it.properties
(IT 翻译)。我的目标是在无法识别语言时使用 rest-messages.properties
,在 IT 语言时使用 rest-messages_it.properties
。
现在它不起作用。 Spring 当所选语言没有对应文件时,REST 读取 rest-messages_it.properties
数据。
我用 messages.properties 使用 messageSource.setFallbackToSystemLocale(false);
解决了这个问题。有没有办法对 rest-messages
个文件做同样的事情?
如果您将 RepositoryRestMvcConfiguration
子类化,重写并复制其方法 resourceDescriptionMessageSourceAccessor
,但将 fallbackToSystemLocale 设置为 false
for [=15],会怎样? =]?
@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();
}