SpringBoot踩坑记

2023-11-02

启动

  • WARNING : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
    解决:根据提示,SpringBoot启动类放置目录不正确,报该错时,我的启动类是直接放在java路径下,没有放在程序根包下。
    错误示例:
    在这里插入图片描述
    正确示例
    在这里插入图片描述
  • 应用打包成war包,部署到tomcat中,发现应用没用启动
    解决:启动类继承SpringBootServletInitializer
    public class XxxApplication  extends SpringBootServletInitializer {
       public static void main(String[] args) {
           SpringApplication.run(XxxApplication.class,args);
       }
    
       @Override
       protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
           return builder.sources(XxxApplication.class);
       }
    }
    

动态数据源

  • 错误描述:

The dependencies of some of the beans in the application context form a cycle:
scheduleJobLogService (field protected com.baomidou.mybatisplus.mapper.BaseMapper com.baomidou.mybatisplus.service.impl.ServiceImpl.baseMapper)

scheduleJobLogDao defined in file [E:\xxxx\modules\job\dao\ScheduleJobLogDao.class]

sqlSessionFactory defined in class path resource [com/baomidou/mybatisplus/spring/boot/starter/MybatisPlusAutoConfiguration.class]
┌─────┐
| dataSource defined in class path resource [io/xxx/datasources/DynamicDataSourceConfig.class]
↑ ↓
| firstDataSource defined in class path resource [io/xxx/datasources/DynamicDataSourceConfig.class]
↑ ↓
| org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker
└─────┘

  • 解决:
    项目中配置了动态数据源,但在启动时报了以上错误,根据提示可知,dataSource注入时出现了死循环,一开始是自定义的dataSource(DynamicDataSource),后续又变成了默认的dataSource(org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker),系统存在两个dataSource。所以我们需要去掉默认的DataSource,改为自定义DataSource,以下是具体代码:
    package io.xxx;
    
    import io.xxx.datasources.DynamicDataSourceConfig;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.context.annotation.Import;
    
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
    @Import({DynamicDataSourceConfig.class})
    public class XxxApplication {
        public static void main(String args[]) {
            SpringApplication.run(XxxApplication.class,args);
        }
    }
    

事务回滚

当程序出现异常时,为了避免数据的不一致性,我们需要进行事务的回滚。所以在讲事务回滚之前我们先来看下Java的异常体系。

在这里插入图片描述
图片转载自关于异常体系的解释,读者可点击该链接阅读。

Error是我们无法通过修改程序来解决的异常,比如OutOfMemoryError、ThreadDeath,当这种异常发生时,线程会直接终止;Exception是我们程序编写不当导致的异常,比如空指针,出现该异常时,程序不会终止,而是继续运行下去。

异常分类:
我们可以将异常分为运行时异常(RuntimeException)和非运行时异常(Exception中除了RuntimeException及其子类以外的)。另一方面,我们可以将异常分为受控异常(checked exceptions)和不受控异常(unchecked exceptions)。
1、受控异常(checked exceptions):就是非运行时异常,即Exception中除了RuntimeException及其子类以外的。
2、不受控异常(unchecked exceptions):RuntimeException和Error。

@Transaction实战遇到的问题

我在将该注解添加Service中的一个方法时,发现程序即使出现异常也没有回滚,后来查了几篇文章,讲到Spring默认的事务异常处理机制是:
Spring框架的事务管理默认地只在发生不受控异常时才进行事务回滚。
若程序Catch住了异常,并且没有往外抛,那么该事务不会进行回滚
遇到这种情况,我们可以通过以下两种方式解决:
1、在类或方法前注解配置@Transactional(rollbackFor=Exception.class)
2、在catch中手动进行回滚,添加如下代码:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

笔者在使用第2种方法时,程序报了以下错误

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope异常处理

根据提示,说当前方法没有开启事务,很奇怪,方法上明明加了@Transaction注解,为啥还提示没有加。仔细看了下代码,发现我的这个方法不是直接被外层调用的,外层是先调用了该方法所在类的A方法,然后A方法调用的它,而A方法并没有开启事务。 将A方法添加@Transaction之后,程序可以正常运行了,事务也可以正常回滚。

第三方集成

Mybatis

  • 错误描述:

     Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): io.xxx.modules.xxx.dao.XxxDao.queryList
    	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227) ~[mybatis-3.4.6.jar:3.4.6]
    	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49) ~[mybatis-3.4.6.jar:3.4.6]
    	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) ~[mybatis-3.4.6.jar:3.4.6]
    	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.4.6.jar:3.4.6]
    	at com.sun.proxy.$Proxy83.queryItfAdvancePaymentList(Unknown Source) ~[na:na]
    
  • 解决:
    提示xml文件中没有queryList这个sql,但文件实际是有的,为何找不到呢?网上提供了几种排查方法,我现在简单罗列一下:

    1. xml文件中的 namespace=“xxx.xxx.xxx.Dao” 中的路径是否与接口文件路径一致。
    2. parameterType类型 与 resultType类型是否与接口文件中定义的类型一致。
    3. xml文件扫描路径是否配置正确,否则xml文件无法被扫描到。

    经过上面的排查,我这边问题依旧存在,但上面的排查给了我大体思路:首先,保证自己的xml文件放置的路径正确;其次,保证xml文件和接口文件中的方法名、参数及返回类型匹配。然后按照这两步骤,发现自己的xml文件放置的文件夹在编译之后没有在扫描路径下,如图:
    在这里插入图片描述
    造成上述现象是由于Intellj Idea的显示模式设置造成的,如图
    在这里插入图片描述
    如果一个文件夹下面只有一个文件的话,子文件夹会和父文件夹连接显示,比如mapper.job,如果要建job的同级目录的话只能选中mapper的父文件夹resources,然后新建mapper.realTime文件夹,但这样子建出来的realTime文件夹其实不在mapper下面,因为它实际的名字叫mapper.realTime文件夹。为了避免此显现,建议将‘Compact Middle Packages’选项取消勾选,这样子目录层级分明,不会出错。下图是取消勾选的效果
    在这里插入图片描述

  • 错误描述:
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'names' not found. Available parameters are [collection, list]

  • 解决:
    因为Mybatis里面用了foreach标签,需要传递一个list进行遍历,如果在dao层方法直接传递list的话就会报该错误,可以在参数名称前加一个注解解决,代码如下:

    public List<Object> getSomethings(@Param("names")List names)
    

    当然也可以将List参数封装到Map里面,需要注意的是key一定要与dao文件里面遍历的key一致。

  • 错误描述:
    mybatis中查询oracle数据库date类型的时间没有时分秒

  • 解决措施:
    原因出在mybatis中的mapper.xml中对象的属性对应的jdbcType=date。jdbcType=date对应的Java类型是java.sql.date,所以没有时分秒。如果想显示时分秒,对象的属性对应的jdbcType应该设置成TIMESTAMP。

     <result column="CREATE_TIME"  property="createTime" jdbcType="TIMESTAMP"/>
    

Quartz

  • 错误描述:
    Caused by: org.quartz.SchedulerException: ThreadPool class 'org.quartz.simple.SimpleThreadPool' could not be instantiated.
    	at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:841) ~[quartz-2.3.0.jar:na]
    	at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1559) ~[quartz-2.3.0.jar:na]
    	at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:650) ~[spring-context-support-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    	at org.springframework.scheduling.quartz.SchedulerFactoryBean.prepareScheduler(SchedulerFactoryBean.java:590) ~[spring-context-support-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    	at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:490) ~[spring-context-support-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    
  • 解决:
    使用Intellij Idea全局搜索SimpleThreadPool这个类,发现其路径为org.quartz.simpl,也就是说simpl后面没有e,好坑的单词。。。

打包

jar包

springboot使用的是maven,通过mvn install指令执行完毕之后,然后java -jar XXX.jar时,提示没有主清单属性
解决:pom文件需要添加一个插件,如下:


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

重新执行mvn install之后,运行jar包,问题解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot踩坑记 的相关文章

随机推荐

  • Frida hook Java层

    往期推荐 frida环境安装 Xposed框架安装 使用及插件开发 HOOK startActivity HOOK框架 动态代理 需要相关资料的朋友 可以 加入此处即可打包获取 需要对在进程外传递的消息进行拦截处理就必须采取一种称为HOOK
  • Hexo博客开发之——七牛云图片批量下载

    一 前言 基于hexo Github搭建的静态博客 图片等资源的存储是一个问题 之前考虑过图片保存本地文件夹 图床 qiniu 微博 等 但是七牛存储的图片会有一些问题 使得我不得不考虑领寻图片等资源的存储问题 1 1 七牛图片存储的问题
  • UE4 加载流关卡(StreamingLevel)

    主要内容 本文主要讲解流关卡的加载卸载以及使用流关卡的好处 使用流关卡的好处在于利于多人协同合作 例如使用SVN进行项目开发时 各自上传或修改各自负责的关卡可以互不干扰 实现步骤 1 新建一个默认的主关卡和两个空的关卡 2 在主关卡里把两个
  • 解决 Ubuntu18.10 无法安装 Nvidia-docker2

    2023年5月18日更新 nvidia 原 github io 网页已废弃 更新了新的主页链接 2022年8月10日更新 很高兴看到这篇文章能够帮助一些同仁 在此更新一下 根据 https nvidia github io nvidia d
  • iOS核心动画CoreAnimation系统进阶(赛贝尔曲线-菜单侧滑动画拆分动画详解)

    我们知道动画是基于绘制的 多次绘制贝塞尔的过程就会形成动画 流畅的动画效果会给用户带来不一样的使用体验 下面我们就让App开发中经常使用到的侧滑动画进行拆分详解 效果图如下 为侧滑动画封装一个slideMenuView 绘制侧滑动画需要下面
  • Raft协议处理各种failover情况

    Raft协议处理各种failover情况 Raft 协议的易理解性描述 虽然 Raft 的论文比 Paxos 简单版论文还容易读了 但论文依然发散的比较多 相对冗长 读完后掩卷沉思觉得还是整理一下才会更牢靠 变成真正属于自己的 这里我就借助
  • MYSQL数据库服务磁盘IO高问题分析与优化

    压力测试过程中 如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大 TPS逐渐降低等 而问题定位分析通常情况下 最优先排查的是监控服务器资源利用率 例如先用TOP 或者nmon等查看CPU 内存使用情况 然后在排查IO问题
  • java学生信息管理系统_毕业设计项目实例(含源码毕业论文)

    一 面向人群 学校的学生信息管理人员以及老师和学生 二 总体功能描述 本系统利用Java Web技术实现了学生信息管理系统 具有简单的学生信息管理功能 实现了以下功能模块 院系信息管理模块 学生信息管理模块 课程信息管理模块 成绩管理模块
  • http常见的特殊字符转义

    Http协议真的好严格 特殊字符诸如 等都会被当做转义字符处理 这样的话请求路径的参数就不对了 所以特殊字符要如下处理 空格 用 20代替 用 22代替 用 23代替 用 25代替 用 26代替 用 28代替 用 29代替 用 2B代替 用
  • python网页点击操作

    你好 在 Python 中 你可以使用 Selenium 库来进行网页点击操作 首先 你需要安装 Selenium pipinstall selenium 然后 你可以使用以下代码来打开浏览器并访问网页 from selenium impo
  • 结构体 & 枚举 在嵌入式开发中的巧妙使用

    结构体 枚举 提到结构体相信大家并不陌生 结构体顾名思义 是一种体 各种变量 的集合 方便了我们对于数据的管理和操作 在嵌入式开发中是必不可少要掌握的技能 那么我就通过举例子的方式给大家讲一下怎样使用结构体 第一种 普通式 我定义一个学生
  • Vue Test Utils

    单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 在提供了经过测试的单元的情况下 系统集成过程将会大大地简化 开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上 而不是陷入充满很多Bug的单元之中不能
  • tab栏切换的实现

    Tab导航栏切换在网页场景中十分常见 本文将介绍如何用js来实现交互的导航栏 分析 1 当鼠标点击上面相应的选项卡 tab 下面盒子的内容跟随变化 2 点击某一个选项 当前这一个底色会变成红色 字体变白色 其余不变 3 下面的模块显示内容需
  • 微信小程序地理位置接口( wx.getLocation )申请方法

    在平时我们在开发小程序时 难免会需要用到用户的地理位置信息的功能 微信小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口 wx getLocation 是无法审核通过小程序的 我自己在开发过程中 就有遇到这样的问题 如下 你
  • Java从入门到实战总结-2.4、Java异常处理及安装IDEA

    Java从入门到实战总结 2 4 Java异常处理及安装IDEA 文章目录 Java从入门到实战总结 2 4 Java异常处理及安装IDEA 1 IDEA下载 安装及卸载 2 异常处理学习点 3 什么是异常 1 概述 2 处理异常 3 tr
  • lock_guard和unique_lock的具体实现

    lock guard和unique lock是C 中用于实现互斥操作的两种机制 lock guard使用RAII 资源获取即初始化 技术来控制锁的作用域 它只有一个lock 函数 可以获取锁 当对象销毁时 关联的锁也会被自动释放 uniqu
  • DCDC轻载与重载的区别

    许多人认为轻载就是负载小 重载就是负载大 其实不然 轻重载的判断最直接的是看输出电流的变化 如果相较于之前的额定电流 通过变化负载 使其电流变小 则说明该电路进入了轻载 反之 则是重载
  • Tomcat 如何查看端口

    1 查看tomcat进程 root longer ps aux grep tomcat 复制代码 或者 root longer ps ef grep tomcat 复制代码 2 根据进程查看端口号 root longer sudo nets
  • auto.js的学习(微信朋友圈点赞实现)

    流程实现 运行环境 auto js4 00 Beta 需要这个版本的话评论或者私聊我 1 启动无障碍服务 auto waitFor auto waitFor 检查无障碍服务是否已经启用 如果没有启用则跳转到无障碍服务启用界面 并等待无障碍服
  • SpringBoot踩坑记

    启动 WARNING Your ApplicationContext is unlikely to start due to a ComponentScan of the default package 解决 根据提示 SpringBoot