Spring启动 - 基于请求

时间:2017-10-13 14:19:10

标签: 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;
    }

}

现在,我们在MessageSource中配置了扩展WebConfig的{​​{1}},我们希望做类似的事情

WebMvcConfigurerAdapter

但显然它不起作用,因为我们在配置期间没有请求...是否有另一种方法根据请求加载消息文件?还是采用其他任何最佳做法?因为我们的另一种选择是每种语言只使用一个文件,并在每个短语的开头使用company.getSlug(),但我们会减少文件的大小......

1 个答案:

答案 0 :(得分:1)

您需要声明每个属性文件:

@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