代码之家  ›  专栏  ›  技术社区  ›  hmahboob

使用@Autowired Environment spring java Null指针异常读取属性文件

  •  1
  • hmahboob  · 技术社区  · 7 年前

    我正在尝试使用环境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");
        }
    }
    

    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;
    

    我对spring很陌生,不知道我会错在哪里。任何帮助都将不胜感激。

    编辑:

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

        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 回复  |  直到 7 年前
        1
  •  0
  •   Brian    7 年前

    我在下面添加了一个基本的工作解决方案。从本质上讲,删除您的 getCountryGeoFilter()

    此外,此配置没有使用任何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;
    
        }
    
    }
    

    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);
        }
    
    }