不能@Autowire配置

Cannot @Autowire configuration

我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value 通过 @Configuration 注释访问配置文件。

我在这里试图实现的是让控制台从配置文件中写出 "hi",通过 @Value 访问该值。我显然错过了 @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);
   }
}

非常感谢。

尝试用这些注释您的测试 class:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes={TestConfiguration.class})

[编辑]抱歉,我没有看到 OP 在使用 TestNG。重点还是Spring没有自举导致的问题。在 TestNG 中,可以通过扩展 AbstractTestNGSpringContextTests.

来完成

确保在您的配置中声明可以解析@Value 表达式的PropertySourcesPlaceholderConfigurer bean。声明这个 bean:

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

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

请注意,您不必对这个 bean 做任何事情,只需声明它,它就会允许 @Value 注释表达式按预期工作。

您可以在每个使用 @Value 注释的 class 中冗余地声明此 bean,但这会很糟糕 practice/style,因为它会在每个新声明中不断覆盖该 bean。相反,将这个 bean 放在最顶层的配置中,它使用 @Value 导入其他配置,你可以从一个地方回收 PropertySourcesPlaceholderConfigurer bean。