SpringBoot项目启动报错踩坑实战记录

 更新时间:2023年02月08日 08:57:39   作者:一宿君  
这篇文章主要给大家介绍了关于SpringBoot项目启动报错踩坑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、redis和jedis版本不匹配

报错日志如下:

Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.DefaultJedisClientConfig
	at 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;

    @Override
    public BService getBService() {
        return beanFactory.getBean(BService.class);
    }
}

B依赖A

@Service
@RequiredArgsConstructor
public class BServiceImpl implements BService {

    private final ConfigurableListableBeanFactory beanFactory;

    @Override
    public 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 {
    
    @Bean
    WebServerFactoryCustomizer<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" />

这种方式一次设置就行。

总结

到此这篇关于SpringBoot项目启动报错踩坑的文章就介绍到这了,更多相关SpringBoot项目启动报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于dubbo的RPC和RESTful性能及对比

    关于dubbo的RPC和RESTful性能及对比

    这篇文章主要介绍了关于dubbo的RPC和RESTful性能及对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java无限递归遍历json对象问题

    java无限递归遍历json对象问题

    这篇文章主要介绍了java无限递归遍历json对象问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mybatis plus in方法使用说明

    mybatis plus in方法使用说明

    这篇文章主要介绍了mybatis plus in方法使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringBoot返回前端Long类型字段丢失精度问题及解决方案

    SpringBoot返回前端Long类型字段丢失精度问题及解决方案

    Java服务端返回Long整型数据给前端,JS会自动转换为Number类型,本文主要介绍了SpringBoot返回前端Long类型字段丢失精度问题及解决方案,感兴趣的可以了解一下
    2024-03-03
  • Java利用JavaCPP调用算法示例

    Java利用JavaCPP调用算法示例

    本文主要介绍了Java利用JavaCPP调用算法示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • spring WebSocket示例详解

    spring WebSocket示例详解

    websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,本篇文章主要介绍了spring WebSocket示例详解 ,有兴趣的可以了解一下。
    2017-01-01
  • java  文件锁的简单实现

    java 文件锁的简单实现

    这篇文章主要介绍了java 文件锁的简单实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • java实现文件变化监控的方法(推荐)

    java实现文件变化监控的方法(推荐)

    下面小编就为大家带来一篇java实现文件变化监控的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringBoot实现HTTP调用的七种方式总结

    SpringBoot实现HTTP调用的七种方式总结

    小编在工作中,遇到一些需要调用三方接口的任务,就需要用到 HTTP 调用工具,这里,我总结了一下 实现 HTTP 调用的方式,共有 7 种(后续会继续新增),需要的朋友可以参考下
    2023-09-09
  • SpringBoot项目中公共字段填充的实现

    SpringBoot项目中公共字段填充的实现

    本文主要介绍了SpringBoot项目中公共字段填充的实现,利用SpringBoot的Aop思想和自定义注解和反射机制的方法来实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论