Spring Boot版本<version>2.2.0.RELEASE</version>
错误如下:
描述:
Parameter 2 of constructor in
com.shawn.foodrating.service.impl.AdServiceImpl
required a bean of typejava.lang.Integer
that could not be found.
行动:
考虑在您的配置中定义“java.lang.Integer”类型的 bean。
我的代码:
@Service
@Transactional(rollbackOn = Exception.class)
@AllArgsConstructor
public class AdServiceImpl implements AdService {
private AdRepository repository;
private FileService fileService;
@Value("${app.ad.DefaultPageSize}")
private Integer DEFAULT_PageSize;
@Value("${app.ad.ImagePath}")
private String AD_IMAGE_PATH;
@Value("${app.ad.ImageUrl}")
private String AD_IMAGE_URL;
加载属性文件
@SpringBootApplication
@PropertySource("classpath:app.properties")
public class FoodRatingApplication {
public static void main(String[] args) {
SpringApplication.run(FoodRatingApplication.class, args);
}
}
不确定它出了什么问题。
最佳答案
当您使用 Lombok 的 @AllArgsConstructor
时,它必须为所有字段创建一个构造函数,包括用 @Value
注释的字段和未注释的字段。
现在Lombok甚至不知道Spring的@Value
注解。所以生成的构造函数看起来像这样:
public AdServiceImpl(AdRepository repository, FileService fileService, Integer DEFAULT_PageSize, String AD_IMAGE_PATH, String AD_IMAGE_URL) {
this.repository = repository;
....
}
您可以运行Delombok来查看实际生成的代码。
另一方面,Spring 在这种情况下看到单个构造函数尝试调用它来创建 bean (AdServiceImpl
),并且只有之后才迭代其字段并注入(inject)由@Value
注释的数据。
现在,当 spring 调用构造函数时,它看到一个整数(DEFAULT_PageSize),不知道它的值(并且 spring 必须注入(inject)一些东西,因为它是构造函数注入(inject)),并抛出异常。
所以就分辨率而言:
在这种情况下,不要使用 lombok 的所有参数构造函数,而是仅为 AdRepository
和 FileService
创建一个非 lombok 构造函数)
或者创建一个带有@Value注释参数的构造函数而不是字段注入(inject)(删除字段上的@Value):
public AdServiceImpl(AdRepository repository, FileService fileService, @Value(${app.ad.DefaultPageSize}"} Integer DEFAULT_PageSize, @Value(...) String AD_IMAGE_PATH, @Value(...) String AD_IMAGE_URL) {
this.repository = repository;
....
}
关于java - Spring Boot使用@Value进行注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58777156/