@ConfigurationProperties的默认值不存在

时间:2018-08-14 11:22:46

标签: java spring spring-boot

在Spring Boot应用程序中,我有一个带有验证和默认值的属性对象。

考虑以下示例Spring Boot应用程序:

@SpringBootApplication
public class DummyApplication {

    @Validated
    @ConfigurationProperties(prefix = "dummy")
    public static class DummyProperties {

        @NotNull
        private String prop = "test";

        // getter, setter ...
    }

    @Component
    @EnableConfigurationProperties(DummyProperties.class)
    public static class DummyComponent {

        @Autowired
        public DummyComponent(DummyProperties properties) {
            Assert.notNull(properties.prop, "prop should have a value");

            // ...
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(DummyApplication.class, args);
    }
}

这与Spring Boot 1.4.x兼容。

在Spring Boot 1.5.x和2.0.x中,我得到一个异常,因为properties.prop为空。但它不应为null,因为我在上面定义了默认值,并且未在代码外设置其他值。

当我删除@Validated注释时,它再次开始工作。

怎么了?

1 个答案:

答案 0 :(得分:0)

解决方案

properties.prop替换为properties.getProp()

原因

注释@Validated使Spring用代理对象包装DummyProperties的实例。

代理对象将所有方法调用委托给基础对象,因此getter和setter可以按预期工作。但是代理对象不委托字段访问,因此使用该代理对象的值。不幸的是,字段值不是从基础对象复制而来的,因此这些字段用null初始化。