java - Spring Boot使用@Value进行注入(inject)失败

标签 java spring spring-boot

Spring Boot版本<version>2.2.0.RELEASE</version>

错误如下:

描述:

Parameter 2 of constructor in com.shawn.foodrating.service.impl.AdServiceImpl required a bean of type java.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 的所有参数构造函数,而是仅为 AdRepositoryFileService 创建一个非 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/

相关文章:

spring - 分段文件上传:Size exceed exception in spring boot return JSON error message

android - Windows 8 - 运行 Eclipse(未找到 Java VM)

java - jpa 和 java bean 外键验证

java - AtomicReferenceFieldUpdater - 方法 set、get、compareAndSet 语义

java - 内存分配,栈和堆

java - 从 Spring Integration 邮件接收 channel 适配器获取实际电子邮件消息

java - 如何使用 JMockit 模拟 Spring 注入(inject)类

reactjs - 如何将 axios 中的数组参数传递到 Spring Controller ?

java - 使用 Keycloak 保护的 REST API 作为 OAUTH2-Provider 的代理

java - Spring Security+Spring 4-禁用同一用户的多重登录