Parameter 5 of constructor in gov.msa.oa.office.controller.distribute.DistributeController

本文分析了一个Spring Boot应用启动时因配置参数注入错误导致的失败问题。问题源于使用了@AllArgsConstructor注解,该注解使得所有类参数被尝试注入,但由于String类型mqCenterId未在容器中定义,导致启动报错。解决方案是改用@RequiredArgsConstructor注解,只注入final或有默认值的字段,避免了此类冲突。此外,文章强调了理解注解作用的重要性,并给出了使用@RequiredArgsConstructor注解的实例。


问题描述:

配置文件中配置了参数,作为固定参数注入到类中,项目启动就报错,如下:

@Value("${rocketmq-center.centerId}")
private  String mqCenterId;
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 5 of constructor in gov.msa.oa.office.controller.distribute.DistributeController required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

原因分析:

可能是类上面的注解用错了,有冲突。

@Slf4j
@RestController
@AllArgsConstructor //是此注解有问题,导致注入配置参数启动报错
@RequestMapping("/xxxx")
@Api(tags = "xxx")

解决方案:

@Slf4j
@RestController
@RequiredArgsConstructor  //使用此注解问题解决
@RequestMapping("/xxx")
@Api(tags = "xxx")

原因分析:注解冲突问题,了解注解的作用很重要。@AllArgsConstructor这个是把类中的所有参数注入到了spring的容器中,在容器中无法找到对应的参数类型,也就是String没有在容器中被管理,所以就会报错,而@RequiredArgsConstructor 的话:

这个是基于lombok的使用时必须导入lombok包。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

同时注意几点:
1.必须声明的变量为final

​ 2.根据构造器注入的,相当于当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入

使用当我们需要注入Bean的时候可以直接在类名称上使用。代替了Autowrited注解
 

@RequiredArgsConstructor
@RestController
@RequestMapping("/omponent")
public class ComponentController {
    private final ComponentService ComponentService;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值