春天 - @PropertySource,获得NPE;(

时间:2015-05-17 09:25:10

标签: java spring

我在使用@PropertySource时遇到了一些问题,我在使用env.getProperty(..)时获得了NPE。 有没有人有任何见解?

我的环境:

  • JDK / JRE:1.6.0_06
  • 操作系统:Linux Mint 13
  • Spring:4.1.6.RELEASE

stacktrace:

Exception in thread "main" java.lang.NullPointerException
    at com.mycompany.app.ExpressiveConfig.main(ExpressiveConfig.java:33)

属性文件/src/main/resources/com/mycompany/app/app.properties

disc.title=Sgt.PeppersLonelyHeartsClubBand
disc.artist=TheBeatles

我的配置类:

package com.mycompany.app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;

@PropertySource("classpath:/com/mycompany/app/app.properties")
public class ExpressiveConfig {

    @Autowired
    Environment env;

    @Bean
    public App get() {
        return new App("hello", env.getProperty("disc.artist"));
    }

    public static void main(String args[]) {
        App a = new ExpressiveConfig().get();
    }

}

模特课:

package com.mycompany.app;

import org.springframework.stereotype.Component;

public class App {

      private final String title;
      private final String artist;

      public App(String title, String artist) {
        this.title = title;
        this.artist = artist;
      }

      public String getTitle() {
        return title;
      }

      public String getArtist() {
        return artist;
      }
}

尝试失败:

  1. 我尝试过使用@PropertySource注释,例如使用file:prefix和属性文件的绝对路径。 在类路径之前删除反斜杠,例如/ @ PropertySource(“classpath:com / mycompany / app / app.properties”)。 将属性文件放在不同的位置。

  2. 我也尝试过使用包含@PropertySources注释的@PropertySource

  3. 我添加了:

    @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){ 返回新的PropertySourcesPlaceholderConfigurer(); }

  4. 非常感谢任何帮助/建议!!

1 个答案:

答案 0 :(得分:1)

Spring只会将依赖关系注入到它自己管理的bean中。由于您自己创建该实例(new ExpressiveConfig()),因此不会执行依赖注入,因为Spring实际上根本没有涉及。

您需要使用该类型的bean定义创建应用程序上下文,并从那里检索实例。

要做到这一点,请将您的ExpressiveConfig注释为春天@Configuration,然后将该类传递给AnnotationConfigApplicationContext,而不是将其自我实例化。然后,您就可以使用getBean(...)从上下文中检索您的bean。