在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
注释时,它再次开始工作。
怎么了?
答案 0 :(得分:0)
将properties.prop
替换为properties.getProp()
注释@Validated
使Spring用代理对象包装DummyProperties的实例。
代理对象将所有方法调用委托给基础对象,因此getter和setter可以按预期工作。但是代理对象不委托字段访问,因此使用该代理对象的值。不幸的是,字段值不是从基础对象复制而来的,因此这些字段用null初始化。