2017-07-24 150 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。