前言
记录开发过程中常见的异常。
一、MySQL
1、MySQL 插入emoji表情错误的解决方案,Incorrect string value: '\xF0\x9F\x98\x84’
原因: mysql的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是emoji表情是4个字节,所以存储不了。
解决方案:
第一步:在有表情的字段上就应该这样做,将该字段设置为utf8mb4
ALTER TABLE table_name MODIFY colum_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
第二步:设置表的字符集
ALTER TABLE table_name CHARSET=utf8mb4;
若前两步可以插入表情了,则不用设置数据库为utf8mb4。
若由于未知原因,你还是不能存储表情,就每次插入啊修改啊之前都set设置下面的语句:
SET NAMES utf8mb4
2、MySQL java.sql.SQLException: Incorrect string value
原因: 字符编码问题造成的。
解决方案:
https://blog.csdn.net/u013066244/article/details/100095693
3、MySQL 提示 check the manual that corresponds to your MySQL server version for the right syntax
原因: 一方面因为是使用了关键字作为表名或者字段名,另一方面可能因为在设置varchar类型的字段时忘记加上引号。
解决方案:
1.检查sql是否有中文字符
2.检查sql字段是否与关键字冲突,如desc,join等
3.检查sql格式,是否含特殊字符,是否正确分行等
4、MySQL server 5.6 + MySQL WorkBench 5.2.47 备份数据库出错
原因: 备份数据库用的那个文件版本太低了,要用高点的版本。
解决方案:
在MySQL Workbench里,点击菜单:Edit–Preferences
选择Administrator,里面第一项,Path to mysqldump Tool
找到MySQL安装目录,注意,不是WorkBench的安装目录哦,选择备份用的那个文件,然后ok确定就好了。
5、MySQL 查询数据时报Syntax error or access violation: 1055 Expression #1 of SELECT list is not 错误解决
原因: 错误发生在mysql 5.7 版本及以上版本会出现的问题,在mysql5.7版本默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准",很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
解决方案:
找到数据库配置文件windows中my.ini文件或linux中的my.cnf文件,在mysqld中增加sql_mode=
[mysqld]
sql_mode=
修改之后重新启动mysql即可。
6、Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE…
原因: 因为在mysql在safe-updates模式中,如果你where后跟的条件不是主键id,那么就会出现这种错误。
解决方案:
- 执行该命令更改mysql数据库模式:
SET SQL_SAFE_UPDATES = 0;
- 在where判断条件中跟上主键id,例如:
delete from firstmysqldatabase.user where UserName='zhangsan' and ID>=0;
二、IDEA
1、Intellij idea 报错:Error : java 不支持发行版本5
原因: 报错应该是项目编译配置使用的Java版本不对,需要检查一下项目及环境使用的Java编译版本配置。
解决方案:
第一步:在Intellij中点击“File” -->“Project Structure”,看一下“Project”和“Module”栏目中Java版本是否与本地一致:
第二步:点击“Settings”–>“Bulid, Execution,Deployment”–>“Java Compiler”,Target bytecode version设为本地Java版本。
2、IDEA 创建第一个maven项目报错:Cannot resolve plugin org.apache.maven.plugins:maven-clean-plugin:2.5
原因: 本地maven的配置文件和仓库地址不一致
解决方案:
在本地新建一个repository文件夹和一个setting.xml文件,然后再配置setting.xml文件,最后在idea中配置maven。
三、Mybatis
1、Error attempting to get column ‘create_time’ from result set. Cause: java.sql.SQLFeatureNotSupported
原因: 表的createtime类型为DateTime,而Java8里面新出来了一些API,LocalDate、LocalTime、LocalDateTime ,但是在默认的情况下,在mybatis里面不支持java8的时间、日期。
解决方案:
- 将mybatis降到3.5.0版本
- 更改javabean类中的createtime的类型为Date
2、Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
原因: 在mapper.xml文件中, 判断了, Date 类型的数据与空字符串的比较。
解决方案:
错误代码示例:
<!-- 错误代码地点 -->
<if test="endDate!=null and endDate!=''">
and c.input_time <=#{endDate}
</if>
只要把那个判断的语句(endDate!=’ ')删除就可以了。
<if test="endDate!=null">
and c.input_time <=#{endDate}
</if>
3、java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2)
原因: 是因为mapper.xml中的注释问题。
解决方案: 把注释去掉再重新运行,否则报错。
4、Loading class com.mysql.jdbc.Driver’. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary
原因: 数据库驱动的依赖版本有关。
解决方案:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
com.mysql.cj.jdbc.Driver是mysql-connector-java 6 中的特性,相比mysql-connector-java 5 多了一个时区:serverTimezone,把数据源配置的驱动改加上 serverTimezone=Asia/Shanghai
即可。
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
总结:
- com.mysql.jdbc.Driver和mysql-connector-java 5一起用
- com.mysql.cj.jdbc.Driver和mysql-connector-java 6 一起用
5、mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXParseException
原因: 因为语句中有一个小于号“<”,在XML中,会被当成一个页面元素来解析,不会处理为mysql的SQL语句的组成部分。
解决方案: 在xml的sql语句中,不能直接用大于号、小于号要用转义字符。
第一种:使用转义字符
<; | < | 小于号 |
---|---|---|
>; | > | 大于号 |
&; | & | 和 |
&apos; | ’ | 单引号 |
"; | " | 双引号 |
例如: state <= 3 则改成 state <= 3
第二种:使用<![CDATA[ ]]>标记
注意:<![CDATA[ ]]>标记的sql语句中的 <where> <if>
等标签不会被解析
<![CDATA[
state <= 3
]]>
这样,将会把SQL语句中与XML页面元素相同的元素屏蔽,是的XML不将其解析为XML的元素,从而生成正确的SQL语句。
6、Mybatis-plus 出现 WHERE null=?
原因: 这是因为mybatis-plus代码生成时,实体没加@TableId注解
解决方案: 实体主键加上@TableId
注解即可。
7、MyBatis-Plus selectMapsPage报错
原因: Page的泛型由 实体(Page) 修改为 IPage<Map<String, Object>>。
解决方案:
代码示例:
@Test
public void selectMapsPage() {
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.like("name", "王");
int pageNum = 1; // 当前页
int pageSize = 3; // 每页大小
// Page<User> 修改为 IPage<Map<String, Object>>
// Page<User> page = new Page<>(pageNum, pageSize); // selectMapsPage会报错
IPage<Map<String, Object>> page = new Page<>(pageNum, pageSize);
userMapper.selectMapsPage(page, wrapper);
System.out.println("总页数:" + page.getPages());
System.out.println("总记录数:" + page.getTotal());
List<Map<String, Object>> list = page.getRecords();
list.forEach(System.out::println);
}
四、Spring框架
1、java.lang.IllegalStateException: Optional int parameter ‘id’ is not present but cannot be translated
原因: 使用基础数据类型接收参数。
解决方案: 将controller层接收数据改用封装数据类型接收参数。如int就用Integer,long使用Long。
2、No converter found for return value of type: class java.util.ArrayList
原因: 这是因为springmvc默认是没有对象转换成json的转换器的,需要手动添加jackson依赖。
解决方案: 手动添加jackson依赖到pom.xml文件中。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
3、spring mvc报错:No more pattern data allowed after {*…} or ** pattern element
原因: 错误是路径通配问题,查找发现是spring升级到5.3之后路径通配发生了变化。
解决方案: 具体解决是把/**/*.css 改为 /*/*.css
,项目中可能涉及多个文件,都要改。
4、SpringBoot 报错 Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured
原因:
- 第一种:就是你在应用中没有配置datasource的一些相关属性,例如:地址值啊,数据库驱动啊,用户名啊,密码啊。
- 第二种:DataSourceAutoConfiguration会自动加载.可以排除此类的自动配置
解决方案:
- 第一种:将application.properties 或 application.xml 相关的数据源属性配置好
- 第二种:如果项目中存在阿里连接池的话这样写,取消加载阿里的和默认的
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class})
5、AOP 记录日志报错:nested exception is java.lang.reflect.UndeclaredThrowableException
原因: 没有找到相应的方法。
解决方案: 将参数的int换为包装类Integer即可。
6、SpringBoot 报错 The dependencies of some of the beans in the application context form a cycle
原因: dataSource的初始化出现了循环。
解决方案: @SpringBootApplication中添加属性:(exclude={DataSourceAutoConfiguration.class})
就可以解决了。
7、OpenFeign 可能出现的The bean ‘XXX.FeignClientSpecification’ could not be registered
原因: 存在一个以上的Feign接口指向同一个微服务。
解决方案: 配置文件添加:
spring:
main:
allow-bean-definition-overriding: true #允许多个Feign接口都指向一个服务
8、Nacos 启动异常 db.num is null & Unable to start embedded Tomcat
原因:
解决方案:
(1)异常一:java.io.IOException: java.lang.IllegalArgumentException: db.num is null
- 步骤1:创建一个名为 nacos 的数据库
- 步骤2:在 nacos/conf 目录下找到 nacos-mysql.sql 文件,打开文件执行 nacos-mysql.sql 脚本里的 sql
- 步骤3:修改 application.properties 文件里的 mysql 配置,修改为自己的数据库连接、账号密码。
(2)异常二:Unable to start embedded Tomcat
- 步骤1:修改 nacos/bin 目录下的 startup.cmd 文件,修改为单机模式,默认是集群模式
- 步骤2:原默认是 cluster 修改为 standalone
9、SpringBoot+Thyemleaf开发环境正常,打包jar发到服务器就报错Template might not exist or might not be accessible
解决方案: https://blog.csdn.net/LiMing_0820/article/details/80878168
总结
记录开发过程中常见的异常。