【Bug 全解决】 Java、Spring boot 后端项目 Bug 总结

news2024/12/25 9:00:56

Bug 收集与总结

本文记录的是 SpringBoot 后端项目使用和运行代码时所遇到的各种问题,全部都已解决,欢迎在评论区补充你遇到的 Bug 哦!仅以本文记录学习社区项目时,所遇到的奇奇怪怪的 bug,以及一些很愚蠢的错误,以警醒自己不再犯同样的错误,共勉!一起进步!

文章目录

  • Bug 收集与总结
      • 请求参数定义多次,无法访问
      • 找不到模板文件
      • Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
      • Could not autowire. No beans of ‘DataSource’ type found
      • Driver com.mysql.jdbc.Driver claims to not accept jdbcUrl
      • Cannot resolve method 'assertEquals' in 'Assert'
      • Injection of resource dependencies failed
      • Could not autowire. No beans of 'DataSource' type found.
      • FUNCTION community.count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
      • spirngboot 启动报duplicate key错误
      • Could not autowire. No beans of 'JavaMailSender' type found.
      • Incompatible types. Found: 'jakarta.mail.internet.MimeMessage', required: 'org.springframework.mail.javamail.MimeMailMessage'
      • An error happened during template parsing (template: "class path resource [templates/site/register.html]"
      • No primary or single unique constructor found for interface javax.servlet.http.HttpServletResponse
      • 检查字节码校验 运行不影响的警告
      • 依赖下载或者导入失败
      • 核心配置文件不生效
      • pom文件的 spring-boot-maven-plugin报红
      • 使用自动注入时,属性为空
      • 使用自定义 yaml 或 yml 实现自动注入时,属性为空
      • Postman 文件无法上传
      • Spring-boot-maven-plunge 爆红

请求参数定义多次,无法访问

屏幕截图_20230203_212649

出现原因:

  • 在 @RequestMapping 中已经定义 params,又在 @RequestParam 中定义 params,导致出现错误。
  • 如果参数前写了@RequestParam(xxx),并且没有添加 require = false ,那么前端必须有对应的xxx名字才行,不然,就会发生错误。
  • @RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。否则也会发生错误。
  • 访问静态文件时,路径为放置在 resource/static 目录下的相对路径,如 test.html 文件在/resourse/static/html/test.html,路径即为 localhost:端口号/html/test.html,除非配置了全局url 前缀。

错误效果如下:

访问页面显示

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Feb 03 21:33:35 HKT 2023
There was an unexpected error (type=Bad Request, status=400).

控制台输出

2023-02-03T21:33:35.418+08:00  INFO 24684 --- [nio-8888-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-02-03T21:33:35.418+08:00  INFO 24684 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-02-03T21:33:35.418+08:00  INFO 24684 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
2023-02-03T21:33:35.430+08:00  WARN 24684 --- [nio-8888-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "username, password" not met for actual request parameters: ]
 

解决方案:

  • 第一种:删去 @RequestMapping 中多余的定义即可。
  • 第二种:要么添加 require = false ,要么请求添加对应参数,要么后端不加该参数
  • 第三种:使用 Post 请求,或者删去这个注解
  • 第四种:书写正确路径即可

注:System.out.printf() 为控制台输出,return、HttpServletResponse等等都是页面输出。

找不到模板文件

控制台报错:

Error resolving template template might not exist or might not be accessible;

解决方案:

  • 修改 application.yml 文件中的配置为:

    保证能够读取 html 文件,注意前有一英文半角 ”点“ ,设置 cache 为不缓存,保证实时修改,实时生效,生产环境推荐,方便调试,部署环境改为缓存型。设置文件路径,/templates 后不要加斜杆。

    spring:
      thymeleaf:
        suffix: .html
        encoding: utf-8
        mode: HTML5
        cache: false
        prefix: classpath:/template
    
  • 修改 Controller 函数访问模板路径为为相对路径,如:/demo/view ,记得最前面有斜杠,最后面没有斜杠,不需要写后缀名,默认 html

Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required

springboot 3版本整合 mybatis 3.0.5版本控制台报错 Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required,NestedIOException 这个类在 Spring 6 版本中直接删除了。对的,直接删除了。而 MyBatis 老版本还没有同步更新,所以直接就报红了。而整合 mybatis 的 mybatis-plus 自然也会报红。

2022 年 11 月26 日凌晨,mybatis-spring-boot 正式发布 3.0.0 版本,完全支持 Spring Boot 3 了。mybatis-plus 也在 2022.12.28 的 3.5.3 支持了 Spring Boot 3 。最好解决办法就是升级版本。

Could not autowire. No beans of ‘DataSource’ type found

  1. 检查项目结构,主启动类位置是否正确
  2. 把自动装配@Autowired换成@Resource

Driver com.mysql.jdbc.Driver claims to not accept jdbcUrl

该报错是配置文件路径错误,重点检查url路径,3306后的 test 为数据库名,注意修改成数据库已有数据库名

mysql8.x版本URL为 jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8

Cannot resolve method ‘assertEquals’ in ‘Assert’

在测试方法中,使用该方法报错,没引入 import org.junit.Assert; 的Assert 包,解决方法如下:

  1. 引入 junit 依赖

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    
  2. 导入正确包 import org.junit.Assert; 的Assert

Injection of resource dependencies failed

测试方法控制台输出:Injection of resource dependencies failed

确定报错对象为 userMapper,发现没有指定 MapperScan,解决如下:

在启动类加入:@MapperScan(“top.yumuing.community.mapper”) 即可

Could not autowire. No beans of ‘DataSource’ type found.

编译报错:Could not autowire. No beans of ‘DataSource’ type found. 代码如下:

@Autowired
DataSource dataSource;

修改 @Autowired 为 @Resource 即可解决

FUNCTION community.count does not exist. Check the ‘Function Name Parsing and Resolution’ section in the Reference Manual

查询分页总页数时出现

使用如下代码出现报错:

<select id="selectDiscussPostRows" resultType="int">
    select count (id)
    from discuss_post
    where status != 2
    <if test="userId!=0">
    and user_id = #{userId}
    </if>
</select>

原因时是 count (id) 代码中,count 与 (id)存在空格,删去空格,变成count(id)即可

spirngboot 启动报duplicate key错误

错误配置:

错误配置

正确配置:

正确配置

Could not autowire. No beans of ‘JavaMailSender’ type found.

Incompatible types. Found: ‘jakarta.mail.internet.MimeMessage’, required: ‘org.springframework.mail.javamail.MimeMailMessage’

错误依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.1.5.RELEASE</version>
<dependency> 

在 2.1.xx 版本的 spring-boot-starter-mail 使用的都是 javax,而在 2.2.xx 的版本中采用的是 Jakarta

Jakarta Mail的前生是JavaMail。JavaMail最后一个版本是于2018年8月发布,已经停止更新。新项目应该使用 Jakarta Mail。

如果混用,将会报以上错误,请勿导包错误,在 .2.xx 的版本中 ,javaMailSender.createMimeMessage() 传输的是 Jakarta

正确导包示例:springboot 3 下使用 3.0.2 版本的 spring-boot-starter-mail ,前提:配置好邮件使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>3.0.2</version>
<dependency> 
package top.yumuing.community.util;

import jakarta.mail.MessagingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;


@Component
public class MailClient {
    private static final Logger logger = LoggerFactory.getLogger(MailClient.class);

    @Autowired(required = false)
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String mailFrom;

    public void sendMail(String to, String subject, String content){
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
            mimeMessageHelper.setFrom(mailFrom);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(content, true);
            javaMailSender.send(mimeMessageHelper.getMimeMessage());
            logger.info("邮件发送成功!");
        }catch (MessagingException e){
            logger.error("发送邮件失败!");
        }
    }
}

An error happened during template parsing (template: “class path resource [templates/site/register.html]”

错误配置:

spring:
  thymeleaf:
	prefix: classpath:/templates

正确配置:

spring:
  thymeleaf:
	prefix: classpath:/templates/

css、js文件配置:放置在 static 下

  • 如果首字符是“/”,则从项目的根目录开始,可以认为是项目下的绝对路径。
    一般项目默认static就是根路径,所以static下的路径中不能写static,应当以 / 代替
  • 如果首字符不是“/”,而是直接以目录名开始,则以当前路径为参考系,可以认为是以当前路径为参考的相对路径
  • 使用“…/”,以当前路径为参考系的上一层路径

No primary or single unique constructor found for interface javax.servlet.http.HttpServletResponse

springboot3 下导不了 javax.servlet.http 包,必须导 jakarta.servlet.http

也就是 http 包 又更改了。

import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

不能导

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

检查字节码校验 运行不影响的警告

OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
“ OpenJDK 64位服务器VM警告:JDK 13中不建议使用选项-Xverify:none和-noverify,并且可能会在其中删除将来的版本”

-Xverify:no 或者 -noverify 这两个都是 JVM 参数,可以禁止字节码校验,提高编译速度,但是就如同警告所说,这两个参数已经过时了。现在 JVM 的运行速度已经十分迅速,无需这两个参数来加速了。

为不影响代码运行的一条警告。解决方法如下:

  • IDEA 软件下

    1. 顶部菜单下的 Run 选项中的 Edit configurations
    2. 取消勾选 Enable lanuch optimization
    3. 点击 apply 即可
  • 其他软件下

    删掉用户变量 _JAVA_OPTIONS

    根据Stack Overflow 上的帖子说,有些项目会自动将 _JAVA_OPTIONS 加到用户环境变量中,例如今天我们所讨论的警告就有可能是 _JAVA_OPTIONS 的值设置成了 -Xverify:no 或者 -noverify

依赖下载或者导入失败

  • 查找顺序:本地仓库、镜像仓库(国内)、中央仓库(国外)

  • 解决方法:

    • 设置镜像

      <!--阿里云镜像(淘宝镜像)-->
      <mirrors>
      <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>;
      </mirror>
      </mirrors>
      
    • 设置私服仓库

核心配置文件不生效

目前,SpringBoot 指定的核心配置文件为 application.properties 或者 application.yml (yaml)。如果,出现拼写错误、配置文件优先级不够高或者没有放入的目录优先级不够高,被覆盖,都有可能失效。

优先级如下:

  • 同级目录下:
    • properties 高于 yaml 高于yml:后两个纯粹是执行速度导致的优先级问题。

pom文件的 spring-boot-maven-plugin报红

IDEA 在右侧的 Mave 选项卡中,点击左上角刷新即可,静待下载完成。

使用自动注入时,属性为空

  • 创建的类的没有加入@Component,没有注入;

  • 创建的类没有书写 get set 方法

  • 配置文件书写语法错误

    yaml 或 yml

    person:
      name: qinjiang
      age: 3
      happy: false
      birth: 2000/01/01
      maps: {k1: v1,k2: v2}
      lists:
       - code
       - girl
       - music
      dog:
        name: 旺财
        age: 1
    
  • @ConfigurationProperties(prefix = “image”) 中 prefix 属性不匹配,即在配置文件中没有前缀为 prefix 的值。

  • 在使用方法中没有 @Autowired 实现注入 ,正确使用如下:

    @Autowired
    ImagePost image;
    

使用自定义 yaml 或 yml 实现自动注入时,属性为空

@Component
@PropertySource(value = "classpath:PostMessage.yml")
@ConfigurationProperties(prefix = "image")

查询资料可知,@PropertySource 注解目前不支持 yaml 或 yml 解析,也就是说,自定义的 yaml 或 yml 文件指定失败。故加入自定义解析类,在 main 目录下,代码如下:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class YamlPropertySourceFactory implements PropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        Properties propertiesFromYaml = loadYamlIntoProperties(resource);
        String sourceName = name != null ? name : resource.getResource().getFilename();
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            // for ignoreResourceNotFound
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException) {
                throw (FileNotFoundException) e.getCause();
            }
            throw e;
        }
    }
}

之后,修改注解 @PropertySource 的解析类,如下:

@PropertySource(value = "classpath:PostMessage.yml",factory = YamlPropertySourceFactory.class)

再次测试,成功注入。

Postman 文件无法上传

Postman 软件具有一个工作空间,所有的文件操作都是在工作空间中完成的,所以,如果出现文件上传失败,即如下情况:

image.png

出现这种情况,只需把所需文件复制到工作空间,再重新在工作空间中选中文件即可。

Spring-boot-maven-plunge 爆红

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>
  • 下载失败,添加阿里云镜像
  • 加上相应的版本号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area &#x1f31f;&#x1f31f; 226. 翻转二叉树 Invert Binary Tree &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

RPC原理与实现

rpc叫做远程过程调用&#xff0c;是指一台机器上的服务通过通信协议调用网络中另一台机器上的程序&#xff0c;并拿到结果。 1、基本流程 基本流程为&#xff1a; 客户端程序通过Client Stub调度rpc函数Client Stub将调用方法、参数按照通信协议序列化成网络二进制数据&#…

koa2中HTTP错误处理

HTTP错误 访问 Web 服务器或应用程序时&#xff0c;服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。 HTTP 状态代码是三位数代码&#xff0c;分为五个不同的类别。 状态代码的类别可以通过它的第一个数字快速识别&#xff1a; 1xx&#xff1a;信息2xx&#xff1a…

“大娘,你听说过ChatGPT吗?”,“你说的那个什么鸡皮蹄,我这饼里加不了!”

最近看到一个有意思的段子&#xff0c;大概意思是&#xff1a; 年轻人去买煎饼&#xff0c;问摊煎饼的大娘知不知道什么是ChatGPT。 大娘摇了摇头&#xff1a;“你说的那个什么鸡皮蹄&#xff0c;我这饼里加不了”。 年轻人尝试跟大娘解释ChatGPT是什么东西&#xff0c;大娘…

快速上手kettle(二)小试牛刀

快速上手kettle二 小试牛刀 一 、前言二 、两个小目标三、 kettle核心概念介绍3.1 转换3.1.1 步骤(Step)3.1.2 跳&#xff08;Hop&#xff09;3.1.3 元素据3.1.4 数据类型3.1.5 并发执行 3.2 作业 四、实践操作4.1 案例1 将csv文件转换成excel文件4.1.1 在kettle中新建一个转换…

在Node.js中接受来自命令行的输入

目录 1、简介 2、readlineSync 3、列表选择一个项目&#xff1a; 4、类似滑块范围的UI: 1、简介 如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互 如何制作一个节点js CLI程序交互&#xff1f; Node.js 从版本7起开始提供了readline模块来执行以下操…

styleFlow数学推导

如果 w 和 z 的变换是线性的&#xff0c;即 w az b&#xff0c;那么 dw a dz&#xff0c; 所以 p(w) dw p(z) dz 等价于 p(w) a p(z) 即 w 的概率密度函数是 z 的概率密度函数乘以一个常数因子。 如果 w 和 z 是通过一个可逆的函数 ϕ 相互转换的&#xff0c;即 w ϕ(…

5.29今日黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;上周五(5月26日)美市尾盘&#xff0c;现货黄金收报1946.01美元/盎司&#xff0c;上升4.76美元或0.25%&#xff0c;日内最高触及1957.31美元/盎司&#xff0c;最低触…

1.3 eBPF的工作原理初探 --- 更新中

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Java学习路线(16)——异常

一、异常 1、概念&#xff1a; 程序在“编译”或“执行”时可能出现的问题。&#xff08;语法错误不算异常&#xff09; 2、常见的异常 数组索引越界空指针日期格式化… 3、作用&#xff1a; 触发异常后&#xff0c;如果没有提前处理&#xff0c;JVM将终止&#xff0c;提高…

chatgpt赋能python:Python中None的使用详解

Python中None的使用详解 在Python语言中&#xff0c;None是一个非常常见的值&#xff0c;它在代码中用来表示空值或未定义的值。本文将介绍Python中None的使用方式&#xff0c;包括创建和比较None对象&#xff0c;以及在函数和类中使用None的方法。 创建和比较None对象 在Py…

chatgpt赋能python:Python中Key的作用及使用方法

Python中Key的作用及使用方法 在Python中&#xff0c;key是一个十分重要的概念。它在数据结构中经常被使用&#xff0c;例如list、dict、set、tuple等等。本文将重点介绍Python中key的作用和使用方法&#xff0c;帮助读者更好地理解和应用它。 什么是Key 首先&#xff0c;我…

返回数组中非零元素的索引np.flatnonzero()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回数组中非零元素的索引 np.flatnonzero() 选择题 以下程序的运行结果是? import numpy as np anp.array([0,1,2,3]) print("【显示】a:");print(a) print("【执行】print(n…

JLabel默认是透明的,所以JLabel设置背景色setBackground之前要setOpaque(true);

JLabel默认是透明的,所以JLabel设置背景色setBackground之前要setOpaque(true); 将不透明设为true,再setBackground jlabel.setOpaque(true); jlabel.setBackground(new Color(0, 0, 0, 100)); //将不透明设为true,再setBackgroundjlabel.setOpaque(true); jlabel.setBackgro…

chatgpt赋能python:Python中n次方的介绍

Python中n次方的介绍 Python中的n次方是指将一个数值或变量的值提高到某个指定的指数值。这在数据科学、计算机科学和科学计算等领域中非常常见。 在Python中&#xff0c;我们可以使用内置函数**或pow函数来实现n次方。 通过**进行n次方运算 使用**运算符时&#xff0c;将要…

哨兵3号(Sentinel 3)卫星数据处理

李国春 本文介绍使用RSD处理欧空局哨兵3号&#xff08;Sentinel 3&#xff09;卫星数据的具体方法。 气象数据多用NetCDF格式交换和存储&#xff0c;气象卫星数据也是如此。气象业内认为HDF5也是NetCDF的一部分&#xff0c;虽然文件扩展名使用的是.nc&#xff0c;但是实际上就…

数据在内存中的存储(1)

目录 一.C语言中数据类型的介绍 1.c语言的内置类型及大小&#xff08;单位字节&#xff09; 2.整型家族 3.浮点数家族 4.自定义类型&#xff08;构造类型&#xff09; 5.指针类型 6.空类型 二.整型数据在内存中的存储 1.二进制 2.整型数据在内存中的存储&#xff08;…

读数据压缩入门笔记01_数据压缩导读

1. 建立在数据压缩上的世界 1.1. 数据压缩技术最让人惊异之处在于&#xff0c;它与过去40年里个人计算的很多重大改变有关&#xff0c;但很少有人知道这一点 1.2. 我们当下生活在其中的这个计算世界&#xff0c;完全建立在数据压缩算法之上 1.3. 图像的压缩 1.3.1. 1978年 …

HMM实现中文分词

引言 在隐马尔可夫模型中介绍了HMM的理论部分&#xff0c;为了巩固理论知识&#xff0c;本文基于HMM实现中文分词。具体来说&#xff0c;通过HMM实现基于字级别的分词算法。 HMM 这里简单说明一下&#xff0c;更详细的请参考隐马尔可夫模型。 这里输入序列为 X 1 : N X_{1:N…

【h5】实现语音转文字

【h5】实现语音转文字 一、需求功能概述是&#xff1a; 二、实现过程1、实现按住录音&#xff0c;松开发送。有两个录音按钮。a. 获取用户的麦克风声音和创建一个MediaRecorder对象&#xff1a;b. 启动和停止录音&#xff1a;c. 将音频数据上传到服务器&#xff0c;并在处理完后…