SpringBoot项目启动报错踩坑

news/2024/11/24 20:57:16/

目录

      • 一、redis和jedis版本不匹配
      • 二、spring循环依赖
        • 2.1、方法1
        • 2.2、方法2
      • 三、允许DefaultServlet默认注册
        • 3.1、方法1
        • 3.2、方法2
      • 四、debug运行报错
        • 4.1、方法1
        • 4.2、方法2

一、redis和jedis版本不匹配

报错日志如下:

Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.DefaultJedisClientConfigat java.net.URLClassLoader.findClass(URLClassLoader.java:382)at java.lang.ClassLoader.loadClass(ClassLoader.java:418)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)at java.lang.ClassLoader.loadClass(ClassLoader.java:351)... 127 common frames omitted

原因就是SpringBoot和jedis版本不匹配导致的,项目中引入redis默认版本为2.7.0

<!-- spring redis session 默认2.7.0 -->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

通过https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis查看对应jedis版本应该为3.8.0,而项目中是3.0.0,修改为3.8.0即可

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.8.0</version>
</dependency>

二、spring循环依赖

***************************
APPLICATION FAILED TO START
***************************Description:The dependencies of some of the beans in the application context form a cycle:projectRelatedController (field private cn......EstimateServiceImpl cn......ProjectRelatedController.estimateService)
┌─────┐
|  estimateServiceImpl (field cn...FillDataAlarmService cn......fillDataAlarmService)
↑     ↓
|  fillDataAlarmServiceImpl (field cn......EstimateServiceImpl cn......FillDataAlarmServiceImpl.estimateService)
└─────┘Action:Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.Disconnected from the target VM, address: '127.0.0.1:1499', transport: 'socket'Process finished with exit code 1

可以看到estimateServiceImpl 依赖了fillDataAlarmServiceImpl fillDataAlarmServiceImpl 又循环依赖了estimateServiceImpl ,这在代码层面是可以的,但在逻辑上是不允许的。

2.1、方法1

最简单粗暴的方法是在全局配置文件中允许循环引用存在,此属性默认值为false,显示声明为true,可回避项目启动时控制台循环引用异常。

spring.main.allow-circular-references=true

2.2、方法2

spring的核心是控制反转依赖注入,循环依赖就是在依赖注入这一步造成的,也就是说AB相互依赖的时候,初始化A必须要初始化B,初始化B必须也要初始化A,所以就会有死循环。

Spring2.6之前的版本会自动处理循环依赖,通过提前暴露bean的注入方式,将实例化和初始化分开做,2.6之后的版本不会自动处理了。

那如果业务场景实在需要循环依赖调用,有一个优雅的方式:控制反转,我们把控制权转到自己手上,使用方法的返回值获取实例对象,替换调通过成员变量注入实例对象,等我们用到的时候再去获取bean实例,不在初始化的时候注入,这样就优雅的避免了项目初始化的时候循环依赖导致的死循环。

示例如下:

A依赖B

@Service
@RequiredArgsConstructor
public class AServiceImpl implements AService {private final ConfigurableListableBeanFactory beanFactory;@Overridepublic BService getBService() {return beanFactory.getBean(BService.class);}}

B依赖A

@Service
@RequiredArgsConstructor
public class BServiceImpl implements BService {private final ConfigurableListableBeanFactory beanFactory;@Overridepublic AService getAService() {return beanFactory.getBean(AService.class);}}

三、允许DefaultServlet默认注册

Caused by: java.lang.IllegalStateException: Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.at org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler.setServletContext(DefaultServletHttpRequestHandler.java:111)at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.enable(DefaultServletHandlerConfigurer.java:85)at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.enable(DefaultServletHandlerConfigurer.java:71)at cn.sto.financial.estimate.interceptor.WebMvcConfig.configureDefaultServletHandling(WebMvcConfig.java:44)at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:644)at 
Disconnected from the target VM, address: '127.0.0.1:8711', transport: 'socket'Process finished with exit code 1

Spring嵌入式Servlet容器提供的DefaultServlet不再注册,如果应用程序需要要它,需要进行一定的配置。

3.1、方法1

server.servlet.register-default-servlet=true

3.2、方法2

@SpringBootApplication
public class StarterApplication {@BeanWebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet() {return factory -> factory.setRegisterDefaultServlet(true);}public static void main(String[] args) {SpringApplication.run(StarterApplication.class,args);}
}

四、debug运行报错

项目debug报错如下:

Error running ‘MallTest.testRun’: Command line is too long. Shorten command line for MallTest.testRun.

出现这个的原因一般是因为项目需要打印的环境变量太长,超过了限制,需要你缩短命令行来解决问题。

4.1、方法1

修改运行配置Configurations,将默认的Shorten command line的值user-local default 改为 JAR mainifest 或者 classpath file,这种办法每次需要对每个类单独设置。
在这里插入图片描述

4.2、方法2

想一步到位,在项目的.idea/workspace.xml文件中添加配置,找到

<component name="PropertiesComponent"></component>

在内部最下面添加一行

<property name="dynamic.classpath" value="true" />

这种方式一次设置就行。
在这里插入图片描述


在这里插入图片描述

一起学编程,让生活更随和!如果你觉得是个同道中人,欢迎关注博主gzh:【随和的皮蛋桑】。专注于Java基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。

在这里插入图片描述


http://www.ppmy.cn/news/22840.html

相关文章

【Quick-Cocos2dx-Commucity】Windows平台发布游戏

文章目录前言操作步骤前言 本示例使用Quick-Cocos2dx-Commucity开发&#xff0c;用VS2019打包发布游戏。演示简易的打包Win平台下的游戏.exe。 操作步骤 1. 首先这是开发的文档&#xff1a; frameworks: 存放Cocos2d-x引擎核心代码及各个平台运行时资源res&#xff1a;存放…

Obsidian 插件(二):Advanced_Slides 的使用

文章目录Advanced Slides 的使用一、 概述1、 简介2、 特征3、 第一个 PPT二、 基础语法1、 水平垂直幻灯片2、 元素注释3、 幻灯片注释4、 块注解5、 元素动画6、 内联样式7、 幻灯片背景样式8、 演讲者模式9、 列表动画10、 画图支持11、 图标12、 表情包13、 图表支持14、 幻…

【Node.js实战】一文带你开发博客项目之初识Koa2(koa2安装使用、搭建开发环境、测试路由)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Android WIFI使用简述

前言 随着Android版本的更新&#xff0c;目前最新的版本是Android 13&#xff0c;并且已经有部分国产手机更新了此版本&#xff0c;对于Android开发者来说&#xff0c;变化其实不那么大&#xff0c;而对于本文章来说就有一些变化。 正文 在Android 12版本中&#xff0c;增加了…

Kafka生成者/消费组详解

什么是 KafkaKafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的基于发布订阅模式的消息引擎系统。Kafka 的基本术语消息&#xff1a;Kafka 中的数据单…

【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(中)

目录 一、基于 Jenkinsk8sGitDocker Hub 等技术链构建企业级 DevOps 容器云平台 1.1 安装 Jenkins 1.1.1 安装 nfs 服务 1.1.2 在 kubernetes 中部署 jenkins 1.2 配置 Jenkins ​1.2.1 获取管理员密码 1.2.2 安装插件 1.2.3 创建第一个管理员用户 1.3 测试 jenkins 的…

拍电影、电视剧需要什么资质?

一、拍电影所需要的资质 根据相关法律法规的规定&#xff0c;电影的摄制、发行、放映均需要具有相应资质方可进行。 01 关于电影摄制的资质 根据《电影管理条例&#xff08;2001年&#xff09;》第九条规定&#xff1a;申请设立电影制片单位&#xff0c;由所在地省、自治区…

Linux破解root密码

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Linux操作…