2017-07-24 149 views
0

我對TestNG,Spring框架等是絕對新的,我試圖通過@Configuration註釋使用註釋@Value訪問配置文件。Can not @Autowire configuration

我在這裏試圖實現的所有目標是讓控制檯從配置文件中通過@Value訪問值寫出「hi」。我必須明顯錯過@Value註釋(或@Autowired或一些其他註釋)的全部點,因爲我所得到的全部是java.lang.NullPointerException

我有以下三個文件(降低到絕對最小值):

config.properties

a="hi" 

TestConfiguration.java

@Configuration 
@PropertySource("config.properties") 
public class TestConfiguration { 
    @Value("${a}") 
    public String A; 
} 

TrialTest.java

public class TrialTest { 
    @Autowired 
    private TestConfiguration testConfiguration; 

    @Test 
    public void test() { 
     System.out.println(testConfiguration.A); 
    } 
} 

非常感謝。

+0

你可以看看這篇文章https://stackoverflow.com/questions/34779838/cannot-autowired-beans-when-separate-configuration-classes – Akash

+0

你沒有使用Spring runner,所以你的測試類不是'檢查注射。請參閱Spring Test文檔以瞭解如何使用TestNG完成此操作。 – chrylis

+0

「@ Configiration」並不打算成爲「@ Autowired」,它用於創建和配置Bean。 – yinon

回答

2

嘗試用這些註釋您的測試類:

@RunWith(SpringJUnit4ClassRunner.class)來

@ContextConfiguration(classes={TestConfiguration.class}) 

[編輯]對不起,我沒有看到,OP是用TestNG。關鍵還是這個問題是由於Spring沒有被引導而引起的。在TestNG中可以通過擴展AbstractTestNGSpringContextTests來完成。

+0

OP專門說TestNG。 – chrylis

+0

@chrylis糟糕... – jingx

+0

非常感謝。恐怕我會很快回到更多的問題:) – Malis

0

確保在您的配置中聲明瞭可以解析@Value表達式的PropertySourcesPlaceholderConfigurer bean。聲明這個bean:

@Configuration 
@PropertySource("config.properties") 
public class TestConfiguration { 
    @Value("${a}") 
    public String A; 

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

需要注意的是你沒有做任何與此豆,只是通過聲明,它將使@Value註釋表達式來達到預期效果。

您可以在每個使用@Value批註的類中冗餘地聲明這個bean,但這將是不好的做法/風格,因爲它會在每個新聲明中覆蓋該bean。相反,將這個bean放在最上面的配置中,該配置使用@Value導入其他配置,並且您可以從一個地方回收PropertySourcesPlaceholderConfigurer bean。