JavaWeb乱七八糟的报错及其原因和解决办法(持续更新中。。。)

文章目录


报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

原因:MySQL服务关闭
解决办法:打开MySQL服务,右键点击开始:
在这里插入图片描述


报错:xxxMapper’ available: expected at least 1 bean which qualifies as autowire candidate.

xxxMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

原因:
检查启动类是否添加了@ScanMapper(com.xxx.xxx.mapper)同时检查mapper路径是否正确
解决方法:
启动类增加ScanMapper注解及mapper位置


报错:Error creating bean with name ‘gatewayConfigurationService‘ defined in class path resourc

Error creating bean with name ‘gatewayConfigurationService‘ defined in class path resource

因为gateway和zuul不一样,gateway用的是长连接,netty-webflux,zuul1.0用的就是同步webmvc。所以你的非gateway子项目启动用的是webmvc,你的gateway启动用的是webflux. spring-boot-start-web和spring-boot-start-webflux相见分外眼红。不能配置在同一pom.xml,或者不能在同一项目中出现

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

不能在同一个 pom文件下,用gateway就不要有 boot-starter-web这个依赖


报错:“nacos is starting with standalone” Error occurred during initialization of VM

"nacos is starting with standalone"  
Error occurred during initialization of VM
Could not reserve enough space for object heap

如果直接点击nacos文件夹下bin目录下的 startup.cmd 会报错,这是由于nacos默认会以集群模式启动,如果想单机测试启动的话,需要:

1.进入 nacos 的 bin 文件夹下,输入 cmd ,即可进入bin目录下得cmd窗口;
2.输入 startup.cmd -m standalone 回车,即可启动成功。


报错:在nacos上配置后发现报错,且服务列表中没有对应的服务

nacos: java,lang.IllegalArgumentException:no server 

检查bootstarp.yml文件查看是否配置了服务注册和发现,正确如下所示:

spring:
  application:
    name: xxx # 微服务名
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos 服务端地址
        file-extension: yml
      discovery: # 服务发现
        server-addr: localhost:8848 # nacos 服务端地址
        cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州 可不写

报错:SqlSession was not registered for synchronization because synchronization is not active

SqlSession was not registered for synchronization because synchronization is not active

解决方法:
serviceImpl增加注解@@Transactional


多数据配置时报错:

dynamic-datasource can not find primary datasource

检查yml配置格式:
正确如下:

# 正确格式
spring:
  datasource:
    dynamic:
      strict: false
      primary: one
      datasource:
        one:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/demo?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
          username: root
          password: 123456
        two:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/demo1?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
          username: root
          password: 123456

报错:Content type ‘multipart/form-data;boundary=xxxx

Content type ‘multipart/form-data;boundary=xxxx

解决方法:删掉@RequestBody或者测试POST的时候使用json


报错:

Column count doesn‘t match value count at row 1 

解决方法:
检查mybatis的insert 列
上下不对应不匹配。
示例是 insert into user(colum1,colum2,colum3)
但是values是(字段1,字段2)这种信息。列名不匹配

invalid bound statement(not found)

查看mapper文件中的namespace是否正确对应


報錯:mybatis plus连接oracle执行sql报错:无效的列类型: 1111

mybatis plus连接oracle执行sql报错:无效的列类型: 1111

原因
mybatis plus执行的sql的字段中存在null值,导致oracle无法判断数据类型

解决方法
1.在yml中添加如下配置,添加配置后,空值不会保存为null字符串依然是空值

mybatis-plus:
  configuration:
    #mybatis-plus发送null给oracle是会报错,所以增加此参数
    jdbc-type-for-null: 'null'

2.指定字段解决方案(感谢CunWaiQiShiXuDa提供的方案)
在字段上增加@TableField(jdbcType=),可以解决mybatis-plus3.1.2版本连接oracle,更新字段为NUll报错的问题


報錯:org.springframework.web.client.HttpClientErrorException$NotFound 404 null

org.springframework.web.client.HttpClientErrorException$NotFound 404 null

原因:
这种报错一般是路径的问题,檢查url是否正確


報錯:前後端接口報跨域
解決方法:
1.在目标方法上添加 @CrossOrigin注解

2.添加CORS过滤器
创建一个配置类,在配置类当中添加过滤器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
@Configuration
public class CorsConfig {
 
    @Bean
    public CorsFilter corsFilter(){ //配置过滤器 推荐
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(source);
    }
}

3.实现WebMvcConfigurer接口,重写addCorsMappings方法

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
public class CorsConfig implements WebMvcConfigurer { //实现WebMvcConfigurer接口
 
    @Override
    public void addCorsMappings(CorsRegistry registry) { //重写addCorsMappings方法
        registry.addMapping("/**") //设置映射
                .allowedOriginPatterns("*")  //设置允许哪些域来访问
                .allowedMethods("GET","POST","PUT","DELETE","HEAD","OPTIONS") //允许哪些方法能访问
                .allowCredentials(true)  //允许是否可以携带cookie
                .maxAge(3600) //设置有效期为3600秒,意思是在3600秒以内,浏览器可以不用再次访问(这时间内跨域ok)
                .allowedHeaders("*"); //允许携带头部信息
    }
}

报错: List.of()方法报错

List.of()方法报错

原因:Java9之前,没有List.of()方法。
修改:需要使用Array.asList()方法


报错:java.net.ConnectException Connection refusedconnect

解决java.net.ConnectException Connection refusedconnect

原因和解决:

1)端口号被占用:杀死占用端口号(一般为8080)的进程,释放端口;彻底关闭 Tomcat 服务器,或者重新启动项目。

2)使用以下命令检查服务器中允许的最大进程数:ulimit -u。如果将此值设置为较低值,例如1024,则使用以下值将其增加到131072或无限制:ulimit -u 131072或者ulimit -u无限制 。

3)客户端和服务器,它们中的任何一个或两个都不在网络中。
它们可能没有连接到LAN或互联网或任何其他网络,在这种情况下,Java将会抛出
客户端的“java.net.ConnectException:Connection refused”异常。

4)服务器未运行用
是服务器已关闭但未运行。在这种情况下,你也会得到java.net.ConnectException:连接被拒绝错误。可ping来检查服务器是否正在运行并侦听端口。

5)服务器正在运行但没有侦听端口,客户端正在尝试连接。
服务器正在运行但是正在侦听不同的端口。验证配置。如果你正在处理一个大项目,并有一个分层配置文件,它可能是默认配置或其他一些设置覆盖了您正确的设置。

6)主机端口组合不允许使用防火墙

几乎每个企业网络都受防火墙保护。如果您正在连接其他公司网络,例如在任何电子交易系统中,需要提高防火墙
双方要求确保他们允许彼此的IP地址和端口号。如果防火墙不允许连接,也会收到相同的java.net.ConnectException:Java应用程序中的连接拒绝异常。

7)主机端口组合不正确。
提供的主机端口组合不正确,或者服务器端的早期主机端口组合已经更改。检查客户端和服务器端的最新配置。
8)连接字符串中的协议不正确

解決:大概率是數據庫達到最大連接數


瀏覽器請求頭加浏览器Content-Security-Policy详解

Content-Security-Policy是什么?
Content-Security-Policy是一种安全策略,它允许网站管理员定义浏览器如何处理一个页面的内容。通过设置CSP,网站可以限制浏览器只加载特定来源的资源,防止恶意脚本的执行。


報錯:调用rest API时抛出httpmediatypenotsupportedexception内容类型’application/x-www-form-urlencoded不受支持

调用rest API时抛出httpmediatypenotsupportedexception内容类型'application/x-www-form-urlencoded不受支持

服务器接受(消费)“multipart/form-data”,但您发送的是URL中的文件和路径。这将始终导致"application/x-www-form-urlencoded"。需要更改服务器以在发送文件时接受它,或者将文件和路径作为主体(在实体内)发送


報錯:上传图片415异常:“Content type ‘multipart/form-data;’ … not supported”

上传图片415异常:"Content type 'multipart/form-data;' .... not supported"

去掉@RequestBody注解就行了


報錯:Invalid bound statement (not found)

Invalid bound statement (not found)

关于 Invalid bound statement (not found): 错误的解决

错误原因
"Invalid bound statement (not found)"错误通常发生在以下情况下:

SQL映射文件丢失或错误:你的MyBatis SQL映射文件可能不存在,或者文件路径、文件名或XML中的语句ID可能存在拼写错误。
MyBatis配置问题:MyBatis的配置文件可能没有正确指定SQL映射文件的路径,或者数据库连接配置有问题。
SQL语句错误:SQL语句可能包含语法错误,表名或列名可能拼写错误。
命名约定不匹配:MyBatis通常使用命名约定来匹配Java方法和SQL语句,如果方法名和SQL语句ID不匹配,也会导致此错误。
缓存问题:MyBatis缓存可能会导致此错误,尝试清除缓存并重新启动应用程序。
解决方法
为了解决"Invalid bound statement (not found)"错误,可以采取以下措施:

  1. 检查SQL映射文件
    确保你的SQL映射文件存在,路径正确,文件名正确,并且语句ID正确拼写和大小写匹配。查看并纠正任何可能的错误。

  2. 检查MyBatis配置
    确保你的MyBatis配置文件(通常是mybatis-config.xml)正确指定了映射器的路径和数据库连接信息。确保它们与实际情况匹配。

  3. 检查SQL语句
    验证SQL语句是否正确,没有语法错误,表名和列名正确拼写。

  4. 检查命名约定
    根据MyBatis的命名约定,确保方法名和SQL语句ID匹配。

  5. 清除缓存
    尝试清除MyBatis缓存,然后重启应用程序,看看问题是否得以解决。

  6. 启用日志记录
    启用MyBatis的日志记录,以获取更多详细信息,了解哪个SQL语句导致问题。可以在MyBatis配置文件中设置日志级别来打印更多信息。


报错:java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

对实体类中时间的类型是String,数据库中类型是Date。
或者數據庫為String,傳的是Date

将数据格式按要求統一即可解決


使用restTemplate调用他们的post接口将图片上传至服务器是,在传入参数时,总是
报错:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class 
java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable
SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain:
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])

原因:不能直接将MultipartFile类型直接作为参数,因为http通常都是以二进制进行数据传输

解決:使用ByteArrayResource直接获取文件资源的二进制然后作为参数进行传输:

    		MultipartFile file = fileInputBody.getFile();
    	
			headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    	    MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();

			String fileName = file.getOriginalFilename();

			ByteArrayResource bar = null;

			try {
				bar = new ByteArrayResource(file.getBytes()){
					@Override
					public String getFilename() {
						return fileName;
					}
				};
			} catch (IOException e) {
				e.printStackTrace();
			}

    	    form.add("file", bar);

    	    HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
    	    
    	    String URL = this.getRealUrl(fileInputBody.getURL());
    		
    		restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
			ResponseEntity<JSONObject> responseBody = restTemplate.exchange(URL, HttpMethod.POST, files, JSONObject.class);
            JSONObject httpBody = responseBody.getBody();

需要注意的是ByteArrayResource 是不包含文件名称的,因此需要重写它的getFilename返回文件名。


报错:“Liquibase: Waiting for changelog lock”数据库死锁问题

先查询:
SELECT * FROM FLW_EV_DATABASECHANGELOGLOCK;
在更新:
UPDATE FLW_EV_DATABASECHANGELOGLOCK SET locked=0, lockgranted=null, lockedby=null 
WHERE id=1;

报错:No MyBatis mapper was found in ‘[xx.mapper]‘ package. Please check your configuration.

原因:当@Mapper 与@MapperScan注解都存在,且@Mapper定义的接口就在@MapperScan定义的接口的basePackage路径下就会产生两次扫描创建bean。
第一次扫描是mybatis-plus的basePackage(会自动取spring boot的应用启动路径作为basePackage)下的@Mapper注册为bean
第二次扫描是mybatis根据@MapperScan定义的basePackage路径的所有接口都注册为bean,
如果第一次扫描的@Mapper在@MapperScan定义的路径内,第二次扫描会发觉bean已存在,报告警
解決:@Mapper 与@MapperScan注解兩個留一個就行


报错:Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs

原因:
1.出现这个问题的原因就是Tomcat启动时会扫描大量jar包,如果含有不符合TLD规范的就会出现这个问题
2.以后基本上不会使用JSP作为视图层,所以我们可能根本不需要TLD这个东西,就算不要TLD也没有什么关系
3.注意两个启动:一个是从tomcat的bin目录中启动,另外一个是从Eclipse中或者别的软件中启动,注意看Eclipse启动部分
解決:
1.可以在Tomcat安装目录下apache-tomcat-9.0.1\conf\catalina.properties文件中看到有以下一串代码,代表的是在启动Tomcat需要跳过检查的jar包
2.那么解决办法就是跳过所以jar包的TLD检查,将所有tomcat.util.scan.StandardJarScanFilter.jarsToSkip=后面的所有通过\连接的这些.jar全部删除(操作之前请备份源文件),直接给tomcat.util.scan.StandardJarScanFilter.jarsToSkip赋值".jar",".jar"代表跳过所有以.jar结尾的文件
3.删除tomcat的work目录中的所有文件避免缓存干扰;清空所有logs目录中的日志文件,为了方便查看日志文件


报错 :javax.management.InstanceAlreadyExistsException:com.zaxxer.hikari:name=mallDataSource

原因:
一个tomcat启动多个springboot项目时会报以下错误:
Caused by: javax.management.InstanceAlreadyExistsException: org.springframework.amqp.rabbit.connection:name=rabbitConnectionFactory,type=CachingConnectionFactory
Spring Boot的spring.jmx资源管理是默认打开的,而两个springboot项目同时使用会冲突,要保证domain是两个不一样的
解决方案:
办法1:
application.yml在项目配置中加入:

spring:
    jmx:
       enabled: false

办法2:
在每个springboot项目中application.yml,default-domain名字随便起:
第一个配置:

spring:
    jmx:
       default-domain: 1
第二个配置:
spring:
    jmx:
       default-domain: 2

报错 :java.lang.IllegalStateException: EntityManager is closed

原因是代码中query有多次读取操作如:(query.getResultList()),query在读取一次之后会自动关闭
解決;避免多次讀取及循環sql


报错 :net.sf.json.JSONException: Object is null

原因:
JSONObject转换时,对象内包含另一个对象,而该被包含的对象为NULL,所以抛出异常。但还有一种极为坑爹的情况:用system.out.println都可以输出结果了,但在最终返回给页面时,还是报这个错误,原因是包含的对象中,一个name一个value,name是String,value是Object,有的value是null…
解决:
换成用com.alibaba.fastjson


报错 :Ambiguous mapping. Cannot map ‘xxxController‘ method

原因:
Controller中存在同名方法


报错 :dataSource or dataSourceClassName or jdbcUrl is required

原因:
dataSource(数据源) 中datasourceclassName 、jdbcurl 这两个配置得重新获取,出现这个错误其实就是自动装配时容器获取不到
application.yml或者application.properties里的配置没有配置好。
如果确定配置好了的,那要查看引入的jar包里是否存在application.yml或者application.properties文件,启动可能加载了这里面的文件导致的问题

spring.datasource.url 修改为spring.datasource.jdbc-url
spring.datasource.driverClassName修改为spring.datasource.driver-class-name

报错 :Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying dire…

解決:

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
改为
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*猪耳朵*

听我说谢谢你,因为有你。。。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值