java - 无法访问属性

标签 java spring properties

我有一个 Spring MVC 应用程序。它在 Tomcat 7 服务器上运行。

我想创建一个 props.properties 文件,以便我的应用程序可以在 Beans 初始化过程中访问属性。

所以我做了以下事情:

1.为我的 web.xml 创建上下文参数

<context-param>
        <param-name>mainProps</param-name>
        <param-value>${catalina.home}/conf/props.properties</param-value>
    </context-param>

2.我创建了一个 MainCobfig 类

@Configuration
@PropertySource("classpath:/racoonsoft/wish/properties/props.properties")
@Import({WebConfig.class })

public class MainConfig {
@Autowired
Environment env;

@Value("${db.host}")
static String dbHost;
@Value("${db.name}")
static String dbName;
@Value("${db.login}")
static String dbLogin;
@Value("${db.password}")
static String dbPassword;

@Value("${ozon.login}")
static String ozonLogin;
@Value("${ozon.password}")
static String ozonPassword;
@Value("${ozon.apiurl}")
static String ozonApiUrl;

@Value("${payture.apihost}")
static String paytureApiHost;
@Value("${payture.merchant}")
static String paytureMerchant;

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

@Bean
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor() {
    return new ScheduledAnnotationBeanPostProcessor();
}

@Bean
public OzonProcessor apiProcessor() {
    return new OzonProcessor(ozonLogin, ozonPassword, ozonApiUrl);
}

@Bean
public PGSQLDataSource pgsqlDataSource() throws Exception{
    PGSQLDataSource result = new PGSQLDataSource(dbHost,dbName,5432,dbLogin,dbPassword,"org.postgresql.Driver","jdbc:postgresql:");
    result.loadSettings();
    if(FacebookController.dbProc==null)
    {
        FacebookController.dbProc = result;
    }
    //FacebookController.dbProc = result;
    return result;
}
@Bean
public PaytureProcessor paytureProcessor()
{
    PaytureProcessor proc = new PaytureProcessor(paytureApiHost,paytureMerchant);
    return proc;
}
}

3 - 我创建了 props.properties 文件并将其放入/conf 目录

当我启动我的应用程序时,它没有抛出异常(找不到文件) - 所以我相信它看到了属性文件。但在 bean 初始化期间,我的字段(dbHost、dbLogin 等)仍然为 null。

如何将属性文件中的值放入我的字段?

请帮助我。

最佳答案

PropertySourcesPlaceholderConfigurer 的带注释的工厂方法必须是静态方法:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

Spring API Reference manual of @Bean对此进行评论。

更详细的解释:

这是因为 PropertySourcesPlaceholderConfigurer 是一个 BeanFactoryPostProcessor (BFPP)。 BFPP 在其他(普通)bean 被实例化和初始化之前对 bean 工厂进行后处理。因此,需要在实例化 MainConfig bean 之前创建 BFPP 才能工作。将此工厂方法标记为静态方法,我们可以在不实例化 MainConfig 的情况下调用该方法。

关于java - 无法访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565167/

相关文章:

java - 如何调试 Spring AOP

PHP property decleration 接受数组并且不接受可以在编译过程中评估的任何其他表达式

ios - 当我在appdelegate中定义了一个属性时,如何使用它?

python - 如何在Python中将方法作为属性调用?

java - Redis 使 key 过期

java - java中信号量数组的初始化

spring - 在Spring/Tomcat中,jndi查找是指哪个配置文件? :

java - 如何使用 Maven for App Engine 设置 Java Eclipse (Juno) 动态 Web 项目

java - 为什么在 Netbeans 中是 "type List does not take parameters"?

java - 请建议一个基本的例子