xxx required a bean of type ‘java.lang.Integer‘ that could not be found

发布时间 2023-03-22 21:11:09作者: IQiuq

日志

2022-11-03 13:15:38.189 ERROR 8384 --- [] [           main] o.s.b.d.LoggingFailureAnalysisReporter    40 : 
***************************
APPLICATION FAILED TO START
***************************
Description:

Parameter 1 of constructor in com.cgws.fintech.fundmall.bizfund.mutual.controller.LcscExternalProvideController 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.

Process finished with exit code 1

源代码如下:

@Slf4j
@RestController
@RequestMapping(value = "/xxx")
@RequiredArgsConstructor(onConstructor_ = {@Autowired})
public class LcscExternalProvideController {

    private final LcscExternalProvideService lcscExternalProvideService;
    @Value("${constants.request.fundCode.maxSize:30}")
    private final Integer maxSize;
    
}

我使用Lombok@RequiredArgsConstructor构造注入替换@Autowired注入,然后使用@ValuemaxSize变量赋值,但启动项目的时候就报上面的异常,说找不到java.lang.Integer类型的bean???
在这里插入图片描述

再看Lombok生成的构造函数
在这里插入图片描述
构造函数里面确实包含有Integer类型,因为@RequiredArgsConstructor注解会检查被final修改的字段,非final修饰的字段不会被包含在构造函数里初始化注入bean

解决

删除maxSize变量的final修饰符,这样就不会被检查

@Slf4j
@RestController
@RequestMapping(value = "/xxx")
@RequiredArgsConstructor(onConstructor_ = {@Autowired})
public class LcscExternalProvideController {

    private final LcscExternalProvideService lcscExternalProvideService;
    @Value("${constants.request.fundCode.maxSize:30}")
    private Integer maxSize;
    
}

再看构造函数,此时没有包含Integer
在这里插入图片描述
项目启动也正常,maxSize也获取到值
在这里插入图片描述

扩展

Lombok还有一个@AllArgsConstructor构造注解,使用该注解不管是否final修饰的成员变量都会被注入,所以@AllArgsConstructor@Value不能同时使用
在这里插入图片描述

onConstructor属性值:

  1. onConstructor_ = {@Autowired}
  2. onConstructor = @_(@Autowired)