0

我正在尝试设置我的 Spring 应用程序,以便.properties根据配置文件读取不同的文件。我正在使用java配置,所以我想做的是:

@Autowired
private static Environment env;

@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
    String[] profiles = env.getActiveProfiles();
    String filestring = "environment."+profiles[0]+".properties";
    ClassPathResource properties = new ClassPathResource( filestring );
    Resource[] resources = new ClassPathResource[] { properties };
    pspc.setLocations( resources );
    return pspc;
}

但是,这env.getActiveProfiles()给了我一个NullPointerException,我认为这意味着尚未注入环境。有人知道我该如何解决这个问题吗?或者,如果这是愚蠢/不可能的,我怎么能做得更好?

4

2 回答 2

0

只是为了让您对自己的方法有另一种看法(显然每个项目的业务案例可能因项目而异),但您所追求的配置类型可能会导致其他令人头疼的问题。安全性浮现在脑海中。通常,多个环境意味着您正在处理与数据库等的各种连接的用户名和密码。将这些值存储在与您的其他配置一致的生产环境中可能会将敏感数据暴露给不需要了解此类事情的开发人员。相反,如果您切换使用 SPeL 表达式并直接引用环境,那么您仍然可以实现运行时配置,但将每个环境的设置移动到应用这些特定配置的服务器(或你有什么)。例子:

<bean id="myDatabase" class="mypackage.MyDatabase" p:username="#{environment['DB_USERNAME']}" p:password="#{environment['DB_PASSWORD']}" .../>

然后在您的服务器上,您可以传入系统属性或使用所需的用户名和密码设置环境变量,它们将在运行时配置。(environment表达式直接解析为您的Environment实例。)

只是一个想法。=)

于 2013-10-23T16:15:16.533 回答
0

正如@kungfuters正确建议的那样,业务案例可能因应用程序而异。这是适用于我的应用程序的另一种选择。

提供以下接口的实现:

ApplicationContextInitializer<ConfigurableApplicationContext>

提供以下方法的实现。识别配置文件的逻辑在此方法中。

initialize(ConfigurableApplicationContext ctx) 

根据识别,设置活动配置文件:

this.applicationContext.getEnvironment().setActiveProfiles(<<yourProfileName>>)
于 2013-10-23T16:49:13.777 回答