问题描述:
配置文件中配置了参数,作为固定参数注入到类中,项目启动就报错,如下:
@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;
}

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

被折叠的 条评论
为什么被折叠?



