我想根据 HttpServletRequest 加载一组不同的 messages_xx.properties,以根据我们的客户区分它们。
在模板和所有应用程序中,我们有一个 @Bean,它根据请求的路径提供实际的客户
@Component
public class CompanySelector {
@Autowired
private ICompanyService service;
public String getURLBase(HttpServletRequest request) throws MalformedURLException {
URL requestURL = new URL(request.getRequestURL().toString());
String port = requestURL.getPort() == -1 ? "" : ":" + requestURL.getPort();
return requestURL.getHost() + port;
}
public Company getActualCompany(HttpServletRequest request) throws MalformedURLException{
String url = getURLBase(request);
Company company = service.findByCompanyUrl(url);
if(company != null){
return company;
}
return null;
}
}
现在,我们在 WebConfig
中配置 MessageSource
,它扩展了 WebMvcConfigurerAdapter
,我们想做类似的事情
@Configuration
@ComponentScan("it.besmart.eshare.web")
public class WebConfig extends WebMvcConfigurerAdapter{
public WebConfig(){
super();
}
@Autowired
CompanySelector companySelector;
@Autowired
HttpServletRequest request;
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
Company company = null;
try {
company = companySelector.getActualCompany(request);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (company != null){
messageSource.setBasename("classpath:"+ company.getSlug() + "_messages");
} else {
messageSource.setBasename("classpath:messages");
}
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
但显然它不起作用,因为我们在配置过程中没有请求...是否有另一种方法可以根据请求加载消息文件?或者还有其他可以采用的最佳实践吗?因为我们的另一种选择是每种语言仅使用一个文件,并在每个短语的开头使用 company.getSlug(),但我们会减少文件的大小...
最佳答案
您需要像这样声明每个属性文件:
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("company1_messages", "company2_messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
并获取消息:
@Autowired
private MessageSource messageSource;
public String myRequest(Locale locale) {
...
messageSource.getMessage(company.getSlug().".messageKey1", null, locale));
...
}
在 company1_messages_fr.properties
:
company1.messageKey1=messageCompany1
在 company2_messages_fr.properties
:
company2.messageKey1=messageCompany2
关于java - Spring boot - 根据请求不同的 messages.properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732028/