我正在尝试读取这样的yml文件。
order:
foo: 5000
bar: 12
我可以用@value
阅读。 (我正在使用Lombok btw)
@Component
@Data
public class WebConfigProperty {
private Integer foo;
private Integer bar;
public WebConfigProperty(@Value("${order.foo}") @NonNull final Integer foo,
@Value("${order.bar}") @NonNull final Integer bar) {
super();
this.foo = foo;
this.bar = bar;
}
}
我正在尝试使用@ConfigurationProperties
,因为yml文件会变得更复杂。但它不适用于@ConfigurationProperties
。
@Component
@ConfigurationProperties("order")
@Data
public class WebConfigProperty {
@NonNull
private Integer foo;
@NonNull
private Integer bar;
}
我还在配置类中添加了@EnableConfigurationProperties
。配置中的所有注释都是这样的。
@SpringBootConfiguration
@EnableConfigurationProperties
@EnableAutoConfiguration(exclude = { ... })
@ComponentScan(basePackages = { ... })
@Import({ ... })
@EnableCaching
错误信息是这样的。
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in {...}.WebConfigProperty required a bean of type 'java.lang.Integer' that could not be found.
Action:
Consider defining a bean of type 'java.lang.Integer' in your configuration.
看起来Spring无法找到yml文件并尝试将空值放入WebConfigProperty
字段。我不知道为什么。
仅供参考,这是一个使用Gradle的多项目应用程序。 yml文件和配置类(未编写)位于同一项目中。 WebConfigProperty
是另一个项目。
修改 根据@Yannic Klem的回答,这两个有效。
@Component
@ConfigurationProperties("order")
@Getter
@Setter
@EqualsAndHashCode
public class WebConfigProperty {
@NonNull
private Integer foo;
@NonNull
private Integer bar;
}
//OR
@Component
@ConfigurationProperties("order")
@Data
@NoArgsConstructor
public class WebConfigProperty {
@NonNull
private Integer foo;
@NonNull
private Integer bar;
}
答案 0 :(得分:3)
Lomboks @Data
注释添加@RequiredArgsConstructor
。
Spring然后尝试将参数自动装配到构造函数。
这会导致您的异常,因为它会尝试查找两个类型为Integer
的bean:foo和bar。
@ConfigurationProperties
应该只为其属性设置默认构造函数和getter + setter。
然后,这些属性会被这些设置者绑定到您的@ConfigurationProperties
类。
您的WebConfigProperty
可能如下所示:
@Component
@ConfigurationProperties("order")
/**
* Not sure about IDE support for autocompletion in application.properties but your
* code should work. Maybe just type those getters and setters yourself ;)
*/
@Getters
@Setters
public class WebConfigProperty {
@NonNull
private Integer foo;
@NonNull
private Integer bar;
}