使用@Autowired环境读取属性文件spring java空指针异常

时间:2017-08-03 21:15:33

标签: java spring maven autowired properties-file

我需要根据在maven项目中使用spring框架传递的输入来读取属性文件。我的属性文件和应用程序上下文出现在src / main / resources

我正在尝试使用环境api来注入属性文件。

代码:

@Component
@Configuration
@PropertySource("classpath:GeoFilter.properties")
public class CountryGeoFilter {

    @Autowired
    public Environment environment;

    @Bean
    public GeoFilterStore getCountryGeoFilter(String country) throws 
CountryNotFoundException, IOException {

    GeoFilterStore countryFilterStore = new GeoFilterStore();

    String value = environment.getProperty(country);
    if (value == null) {
        throw CountryNotFoundException.getBuilder(country).build();
    }
    String[] seperateValues = value.split(":");

    countryFilterStore.setGameStore(isTrueValue(seperateValues[0]));

    countryFilterStore.setVideoStore(isTrueValue(seperateValues[1]));
    return countryFilterStore;
    }

    private boolean isTrueValue(String possibleTrueValue) {
        return !possibleTrueValue.equals("No") && 
        !possibleTrueValue.equals("N/A");
    }
}

但是我一直在第34行"字符串值= environment.getProperty(country);"

我的applicationContext.xml(src / main / resources)

<bean
    class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:GeoFilter.properties" />
</bean>

我还在web.xml中设置了contextparam

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

我正在以下列方式启动并调用该函数

    CountryGeoFilter objGeo = new CountryGeoFilter();
    GeoFilterStore response = objGeo.getCountryGeoFilter(country);
    return response;

我对春天很新,不知道我哪里出错了。任何帮助将不胜感激。

编辑:

我更新了启动代码以使用上下文

    ApplicationContext context = new 
    AnnotationConfigApplicationContext(CountryGeoFilter.class);
    CountryGeoFilter testGeoFilter = 
    context.getBean(CountryGeoFilter.class);
    testGeoFilter.getCountryGeoFilter(country);

现在我收到以下异常

   Exception in thread "main" 
   org.springframework.beans.factory.UnsatisfiedDependencyException: 
   Error creating bean with name 'getCountryGeoFilter' defined in .. 
   Unsatisfied dependency expressed through method 
   'getCountryGeoFilter' parameter 
   0; nested exception is 
   org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
   qualifying bean of type 'java.lang.String' available: expected at 
   least 1 bean which qualifies as autowire candidate. Dependency 
   annotations: {}

1 个答案:

答案 0 :(得分:0)

我在下面添加了一个基本的工作解决方案。实质上,在getCountryGeoFilter()方法上删除@Bean,并更改调用方式。我在@RestController类中提供了一个示例调用。

此外,此配置未使用任何XML配置。

TestClass.java

@Component
@Configuration
@PropertySource("classpath:test.properties")
public class TestClass {

    @Autowired
    Environment environment;

    public String test (String property) {

        final String value = environment.getProperty(property);

        System.out.println("========> Property: " + value);
        // TODO: Something with the prop val

        return value;

    }

}

test.properties

prop1=prop_1_value
prop2=prop_2_value

TestController.java

@RestController
@RequestMapping("/test")
public class TestController {

    private TestClass testClass;

    TestController(TestClass testClass) {
        this.testClass = testClass;
    }

    @RequestMapping("/{propName}")
    public String test(@PathVariable String propName) {
        return testClass.test(propName);
    }

}