Java那些乱七八糟的问题
Java那些乱七八糟的问题
小码同学本文章是记录自己遇到的错误,总结错误,今后再遇到错误也可以回头参考一下,本文会持续更新
JavaSE
程序包javax.servlet不存在
解决方法
引入javax.servlet
包,在maven的pom文件添加如下
1 | <dependency> |
Log4j报错
1 | log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). |
解决方法
在pom.xml添加slf4j的依赖即可
1 | <dependency> |
java: 错误: 不支持发行版本 5
错误展示:
解决方法
将项目设置的JDK同步语言级别。
1. 打开项目结构
2. 将语言级别改为JDK版本
3. 项目字节版本和目标字节版本改为JDK版本
不再支持源选项 5。请使用 7 或更高版本
Maven构建失败
Failed to execute goal org.apache.maven.plugins
1 | [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project lab11: Compilation failure: Compilation failure: |
解决办法
在pom.xml
添加插件maven-compiler-plugin
就可以解决
1 | <build> |
不再支持源选项 5。请使用 6 或更高版本
1 | [ERROR] 不再支持源选项 5。请使用 6 或更高版本。 |
解决方法一
按照上面错误的java: 错误: 不支持发行版本 5
设置好对应的JDK版本,再在pom.xml
添加如下设置即可,设置JDK版本为11
,JDk版本根据自己的情况设置。
1 | <properties> |
或者下面这个都可以
1 | <properties> |
解决方法二
设置当前项目结构JDK版本
文件-->项目-->SDK
设置JDK版本大于报错的版本,比如设置JDK11
然后再设置语言级别,也是在当前页面下,在SDK下方,设置语言别对应的JDK版本,比如我刚刚设置了JDK11
,那语言级别也要设置11
设置全局JDK版本
文件-->设置-->构建、执行、部署-->编译器-->Java编译器-->项目字节码版本
设置版本为11
。在该位置的下方的模块,设置目标字节码版本为11
。
总之,就是你设置的JDK版本要和字节码对应版本号
。
java: 警告: 源发行版 17 需要目标发行版 17
原因
SringBoot版本从3.0开始默认依赖JDK是JDK17,我使用的是JDK11,因此出现了错误。
解决方法
- 使用JDK17以上
- 修改pom.xml的 SpringBoot版本为2.x版本
Maven识别失败
Maven图标没有识别为蓝色
选中pom.xml
文件
右键添加为Maven项目
等待项目构建结束就可以了
Spring、SpringMVC
SpringMVC运行报错没有刷新
1 | Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@6fd02e5 has not been refreshed yet |
解决方法
在注册配置之后刷新一下Ioc容器,再获取bean就没问题了。
1 | public class App { |
运行Spring项目出错
Unsupported class file major version 61
ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn’t supported yet
1 | org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\Cache\Java\lab-2\lab07\target\test-classes\cn\edu\seig\JdbcTest.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\Cache\Java\lab-2\lab07\target\test-classes\cn\edu\seig\JdbcTest.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 61 |
解决方法
网上寻找一番大概是JDK和Spring
版本不对应。我用的是jdk17
,我用是5.2.10.RELEASE
版本不行,一直构建失败,换了5.3.18
就行了。
将spring的依赖改为5.3.18
就好了
Maven使用clean命令出错
报错内容
It is highly recommended to fix these problems because they threaten the stability of your build.
For this reason, future Maven versions might no longer support building such malformed projects.
翻译:
强烈建议修复这些问题,因为它们会威胁构建的稳定性。因此,未来的Maven版本可能不再支持构建这种畸形的项目。
解决方法
将pom.xml文件下的maven插件删除就好了。
out.print报错 && out.没有提示
out.print报错是因为没有找到servlet
的包,将包导入就可以解决问题,out
需要jsp.jar
和servlet-api.jar
包,将这两个包导入即可。
解决方法一
用maven
导入jar包,在pom.xml
文件添加如下内容
1 | <dependency> |
打开pom.xml文件
添加内容
重新加载项目jar包
解决方法二
将本机的tomcat下的bin的jsp.jar
和servlet-api.jar
包导入到idea的项目中
打开tomcat
在WEB-INF新建一个lib文件夹
把包放进去
添加lib为一个库
确认
添加库成功
添加为库成功的话,包是可以展开看到包的内容的。
错误’xxx‘不是一个有效的JRE主目录
报错显示
解决方法
原因是我们选择JRE的路径不对,因为我们的JDK是包含有JRE的,所以我们将JRE的路径选择为我们的JDK的根目录即可解决这个问题。
Could not open ServletContext resource XXX
在Web
项目启动后就报如下错误
报错内容
1 | Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/druid/druid.properties] |
根据报错内容可以看到是没找到/druid/druid.propertie
这个文件,我们找一下哪里有引用这个文件,找到这个调用位置,可能是写写错了路径。
解决问题
我们在bean.xml配置了错误,在Web项目中,文件的调用位置都不太一样,不能像以往在Test.java的位置调用一样,在Web项目中,需要添加classpath:
,比如以下的错误修改为:
1 | context:property-placeholder location="druid/druid.properties"/> |
修正后:
需要加上classpath:
1 | <context:property-placeholder location="classpath:druid/druid.properties"/> |
请求的资源[xxx]不可用
错误展示
出现该错误的情况有非常多,以下的方式只适合参考,不一定适合你
导包错误
我在导包的时候,手快导入了import jakarta.servlet.annotation.WebServlet;
这个包,实际上导入这个包是错误的,并不能正确使用WebServlet
,实际上应该导入是import javax.servlet.annotation.WebServlet;
这个包
修改正确
导入import javax.servlet.annotation.WebServlet;
就可以正确运行了
生产工具
隐藏IDEA项目中的文件或文件夹
效果
如下图,我隐藏文件后的效果,原本的Java项目下一班都会有.mvn、HELP.md、.idea等待文件夹或文件,我们可以删除它,但也可以将它隐藏起来,但最好的方法还是隐藏起来,我们看不见就好。
方法
文件
–>设置
–>文件类型
–>忽略的文件和文件夹
–>点击+
号–>添加要隐藏的文件名
*:表示匹配全部
如*.md
表示隐藏以.md
文件结尾的全部文件或文件夹
Intellij乱码
方法一
打开设置
打开设置设置文件编码为utf-8
打开编辑器–>文件编码
把编码改为UTF-8
或者其他
方法二
打开帮助
打开打开自定义VM选项
设置虚拟机加载为utf-8
添加一条语句在配置下面
1 | -Dfile.encoding=UTF-8 |
IDEA打开失败
Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
正常打开IDEA就出现以下错误,昨天还能正常使用,重新启动了几次,也无法解决问题。
1 | Internal error. Please refer to https://jb.gg/ide/critical-startup-errors |
分析问题
分析了一下报错内容,端口被占用,无法启动
,可能idea打开时需要的某些端口已经被其他程序占用了,导致无法启动,既然这样,把那些占用的端口接触就好,或者把idea需要的端口改一下,思路确实很简单,但还有个更简单粗暴的方法,重启大法
,哈哈哈,重启后。所有端口都会重新分配,如果idea是最先使用端口,那就不存在idea需要的端口被占用了。
网上搜了一下解决方法,在idea社区看到某位大佬的评论,大概意思是说:idea在启动时会绑定本地服务器的6942-6991之间可用的任一端口,如果idea无法绑定到该端口,则会抛出异常。这段范围的端口几乎不可能全部都被使用,唯一可能的就是某些网络安全不允许该范围的端口的使用,被保护了,即使在主机使用也不允许。
这让我想起来,我上一次使用使用class for window代理端口为0
不能这个正常使用也有一定关联,上一次也是因为class也需要绑定某个端口,但这个端口被安全保护,不能被使用,最后修改class需要的端口,在这里,其实也类似,要么修改端口保护范围,要么修改idea使用的端口范围,或者重启电脑,重启后电脑的安全端口似乎会动态改变,这样可能idea的端口使用范围就可以使用,或者真的是这全部的端口范围都是占用了,但这几率不大。
解决方法
重启电脑
重启电脑后,我的idea可以正常使用了。如果你的idea还是无法使用,可以参考以下的方法。
修改安全保护端口范围
查看tcp协议端口排除范围,看看是否存在6942-6991
的范围,可能这段端口范围在安全保护范围内,那就需要修改安全保护端口范围,或者重启netsh应该也是可以的,重启后会动态改变安全保护端口范围
1 | netsh interface ipv4 show excludedportrange protocol=tcp |
参考资料
Internal-Error-on-Startup-of-IntelliJ-IDEA-Cannot-Lock-System-Folders
数据库
URL缺少时区
在url
加上?serverTimezone=UTC
这一句,如下
1 | String url = "jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC"; |
SSL安全提示
在连接数据库的url
加上&verifyServerCertificate=false&useSSL=false
,如下
1 | url=jdbc:mysql://localhost:3306/yootk?useUnicode=true&characterEncoding=utf-8&verifyServerCertificate=false&useSSL=false |
URL填写错误
报错内容
可能是连接数据库链接出错
1 | Caused by: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key host |
改正URL
1 | url = jdbc:mysql://localhost:3306/yootk?useUnicode=true&characterEncoding=utf-8 |
中文乱码
在连接数据库的URL加上useUnicode=true&characterEncoding=utf-8
,如下
1 | url = jdbc:mysql://localhost:3306/yootk?useUnicode=true&characterEncoding=utf-8 |
Spring整合mybatis连接不上
解决方法
将{$jdbc.password}
改一下就好了${jdbc.password}
Spring mapper出错
No qualifying bean of type ‘site.hikki.dao.BookDao’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
大概意思就是没有找到site.hikki.dao.BookDao
的bean,没有可用的。
解决方法
public interface BookDao {}
这个接口不需要添加@Repository
的,应该是在MybatisConfig.java
中添加bean的。如下:
1 | //重点添加bean |
启动MySQL拒绝服务
错误如下
解决方法
可能是某个安全软件禁止
了MySQL自启动,关闭就好了,改为允许启动
安装MySQL出错
报错内容大概如下
1 | 请键入 NET HELPMSG 2185 以获得更多的帮助。 |
解决方法
进入MySQL的安装位置
MySQL的默认安装位置:C:\Program Files\MySQL\MySQL Server 8.0\bin
使用管理员
权限打开CMD
,用PowerShell
也可以。
加载MySQL服务
1 | .\mysqld.exe --install |
初始化用户
1 | .\mysqld.exe --initialize --user=mysql --console |
参考文章:
连接MySQL出错
报错内容:Access denied for user ‘root’@‘localhost’ (using password: YES) Access denied for user ‘root’@‘localhost’ (using password: YES)
在IDEA中出现该错误
如果你是在IDEA连接数据库发生该错误如下:
1 | Access denied for user 'lilbai'@'localhost' (using password: YES) Access denied for user 'root'@'localhost' (using password: YES) |
其中lilbai
是你的电脑用户名,该错误很简单,你如果是spring或者springboot的,就是jdbc.properties
设置的数据库连接用户名为username
,Java在调用该变量时,引用的值不是你写的值,而是你电脑系统环境变量里面的username
值。
简单来说,就是Java里面设置的usernmae
变量和系统环境变量的username
冲突了,而系统的环境变量优先级更高,导致在连接数据库时调用系统的环境变量,而没有调用你Java里面的环境变量。
解决方法:
将jdbc.properties
的username
改为jdbc.username
就行,建议以后都用jdbc.username
这种方式去命名,防止环境变量引起的错误。
解决方法
关闭mysql服务
打开CMD
或者PowerShell
窗口
1 | net stop mysql |
跳过权限验证
1 | mysqld --console --skip-grant-tables --shared-memory |
运行该指令如果出错爆红,可能是你的mysqld
没有设置环境变量,可以去环境变量的Path
添加一个C:\Program Files\MySQL\MySQL Server 8.0\bin
就可以了。
运行该指令不要关闭该窗口或者停止该指令的运行。
进入mysql修改远程密码
1 | mysql |
打开一个新的CMD
或者PowerShell
窗口,刚刚的窗口不要关闭
关闭权限验证
打开刚刚运行mysqld --console --skip-grant-tables --shared-memory
指令的窗口,Ctrl + C
停止该任务,或者关闭该窗口也行。
启动mysql
1 | net start mysql |
启动成功之后,就可以连接数据库了。
【MYSQL8 已解决】Access denied for user ‘root‘@‘localhost‘ (using password: YES)问题
MySql错误 1251 - Client does not support authentication protocol requested by server 解决方案
连接MySQL时出现:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)-解决办法
DBeaver连接mysql提示安全出错
错误显示:**Public Key Retrieval is not allowed Public Key Retrieval is not allowed **
解决方法
在数据库后面按加上如下内容即可:
1 | mysql?allowPublicKeyRetrieval=true |
文章参考:
连接mysql时报错Public Key Retrieval is not allowed的解决方法
Invalid bound statement (not found)
我使用的SpringBoot集成mybatis,出现了错误,以下方法仅供参考。
可能是以下三种错误:
- 语法错误
- 编译错误
- 配置错误
语法错误
需要到Ddao层的接口添加@mapper
注解
1 | import org.apache.ibatis.annotations.Mapper; |
BookMapper.xml文件
-
Dao的形参和xml的参数类型是否一致
-
SQL返回类型是否符合查询的结果集类型
-
Dao的方法名是否和xml的id一致
1 | ?xml version="1.0" encoding="UTF-8" ?> |
编译错误
我的mapper.xml存放在resource/mapper/
文件夹下,需要做资源过滤,不然SpringBoot就会拦截,导致无法找到该文件。
1 | <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 --> |
配置错误
我们使用SpringBoot集成mybatis时,必须指定实体类的包名,否者你在编写xml时,实体类需要使用实体类的绝对路径。
我们在application.properties
配置mybatis的相关配置。
1 | mybatis.mapper-locations=classpath:mapper/*.xml |
Cannot determine value type from string ‘xxx’
错误内容
1 | org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'category_name' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string '生活' |
或者出现这个错误也是同一个问题造成Index 1 out of bounds for length 1
分析
从问题抛出来看,大概内容可以看出来是结果映射有问题,可能是mybatis接收的类型和数据库的类型没对应上,可以先去看一下。
这是我写的Category查询:
1 | public Integer selectCategoryByName(String categoryName) { |
查看Category
实体类,我使用了lombok
插件,同时使用了@Date
和@Builder
注解,经上网查找资料,需要给Category实体类添加一个无参构造函数,用于与数据库作数据映射,那就使用lombok插件再添加一个注解就好了。
1 | package site.hikki.model.entity; |
解决办法
- 给实体添加无参构造函数
- mapper.xml中查询的数据库字段属性的类型要和有参构造器的字段类型一一匹配;查询字段的个数要和有参构造器个数一样
mybatis异常集之Cannot determine value type from string ‘xxx‘
SpringBoot
SpringBoot启动类注解缺失
Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.
原因
注解配置错了,不应该@SpringBootConfiguration
,正确的注解应该是@SpringBootApplication
解决
将@SpringBootConfiguration
注解改为@SpringBootApplication
就可以了。
1 | import org.springframework.boot.SpringApplication; |
细心,还是细心,非常重要
devtools版本不兼容
org/springframework/boot/SpringApplicationAotProcessor
1 | Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplicationAotProcessor |
原因
这是我的依赖配置,我添加了devtools依赖才报错,大概率原因是依赖不兼容的问题。
1 | <!--devtools热部署--> |
解决
尝试换一个devtools版本,更换掉2.5.4版本就没问题了。
1 | <!--devtools热部署--> |
spring-boot-maven-plugin报错
错误展示
换成spring-boot-starter-parent
相同版本
1 | <parent> |
1 | <build> |
错误原因是找不到spring-boot-maven-plugin
,让spring-boot-maven-plugin
版本和spring-boot-starter-parent
相同就可以找到该版本了
没有设置数据库信息
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
这个错误是在创建SpringBoot时,引入了数据库,但没配置数据库的连接信息,然后启动了SpringBoot项目,于是就报错了。
1 | java.lang.IllegalStateException: Failed to load ApplicationContext |
解决方法
在启动类中,在@SpringBootApplication()
注解上添加exclude= {DataSourceAutoConfiguration.class}
忽略数据库连接,这样就不会出错了。
1 | import org.springframework.boot.SpringApplication; |
序列化操作失败
1 | DefaultSerializer requires a Serializable payload but received an object of type [site.hikki.pojo.Teacher] |
原因分析
在Spring Boot中,缓存通常使用缓存管理器来进行操作,而缓存管理器又依赖于序列化操作。因此,如果你的实体类需要被缓存在缓存中,必须实现Serializable接口,以便将对象序列化为字节数组,并存储在缓存中。
同时,使用序列化也对缓存的可靠性和扩展性有很大的帮助,可以方便地将缓存数据移植到其他系统或平台。
所以,在开启缓存@EnableCaching之前,需要确保你的实体类都实现了Serializable接口,这样才能安全地将它们存储在缓存中。
解决
在实体类中实现Serializable接口就好了。
1 | import javax.persistence.Entity; |
Maven
Maven拉取依赖失败
Could not find artifact xxx.xxx.xxx:jar:unknown in aliyunmaven (https://maven.aliyun.com/repository/public)
为什么会失败?
错误一:
原因是我们原本设置的依赖仓库是在阿里云仓库,有时候在Maven官方仓库添加了新依赖,阿里云仓库没有及时更新,阿里云仓库自然就没有这个依赖,就会导致拉取阿里云仓库的依赖失败。
有些依赖用得比较少,阿里云可能会考虑成本的原因就没有将这些依赖添加进去,自然也没有依赖,也会导致拉取依赖失败。
总之:就是阿里云没有这个依赖就对了
错误二:
可能是你没有指定版本,源仓库不指导你要的是哪一个版本,就报错了,你指定一下版本可能就可以解决问题了。
如果你是SpringBoot项目,有时候你指定版本和不指定版本都可以正常拉取依赖,这次不指定版本为什么就拉取失败了?
原因是SpringBoot内置了非常多的依赖版本组合,SpringBoot通过组合大量的依赖版本,减少开发者添加不同的依赖版本造成的冲突问题。但这样也会存在一个问题,有些依赖是SpringBoot没有添加的,这时就得开发者自己添加版本了,不然就会报上面这个错误了,表示Maven找不到依赖,这时我们自己添加依赖版本就可以解决问题了。
怎么解决?
阿里云没有这个依赖,那我们就去官方拉取就好了,官方仓库服务器在国外,下载的速度不是很理想,但只是偶尔用一下,我们可以给单独的项目设置Maven官方仓库源。
给项目指定仓库源
放在<project>
标签下就好了,重新刷新一下就可以在官方源拉取项目了。
1 | <project> |