java - Spring boot - 根据请求不同的 messages.properties

标签 java spring spring-mvc

我想根据 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/

相关文章:

java - Spring Maven - 无法加载ApplicationContext NoSuchBeanDefinitionException : No qualifying bean of type

java - Eclipse 有宏记录器吗?

Java hibernate 。创建有错误的记录

java - 方法中括号中使用参数和不使用参数有什么区别

java - 在 Tomcat 5.5 上运行应用程序

java - SpringMVC自定义集合编辑器不将数据返回到Jsp

java - Spring mvc 分页

spring - 为 JPA 可分页对象设置默认页面大小

java - "No matching benchmarks"当在 eclipse 中从 main 运行 JMH 时

java - 按下 JButton 时绘制矩形