“爱生活”小项目问题总结

目录

爱生活小程序

1.用户登录和注册模块遇到的问题

1.1在使用密码加密时,注册新用户,客户端响应401的问题

原因:

正确操作:

[1.2在设置密码加密后,发送post登录请求,服务器出现报错java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not "opens java.lang.invoke" to unnamed module @dbf57b3](#1.2在设置密码加密后,发送post登录请求,服务器出现报错java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not "opens java.lang.invoke" to unnamed module @dbf57b3)

[InaccessibleObjectException 错误的原因](#InaccessibleObjectException 错误的原因)

[1.3使用没有加密的密码登录,出现Encoded password does not look like BCrypt](#1.3使用没有加密的密码登录,出现Encoded password does not look like BCrypt)

原因:

解决方案:

步骤:

实现效果:

2.广场发布动态遇到的问题

[2.1在广场动态实体类中,我定义了一个属性imagesList,其目的是为了在上传多个图片时更好操作,但在上传图片文件时出现了报错,且在数据库中images列没有数据,Error updating database. Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'imageList'.](#2.1在广场动态实体类中,我定义了一个属性imagesList,其目的是为了在上传多个图片时更好操作,但在上传图片文件时出现了报错,且在数据库中images列没有数据,Error updating database. Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'imageList'.)

原因:

解决方案:

最终实现效果:

忽视的细节:

[2.2文件超出默认大小限制,抛出Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:](#2.2文件超出默认大小限制,抛出Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:)

解决方案:


爱生活小程序

1.用户登录和注册模块遇到的问题

1.1在使用密码加密时,注册新用户,客户端响应401的问题


原因:

是我的SecurityConfig.java 配置类仅定义了一个 PasswordEncoder Bean(用于密码加密),但 没有配置 Spring Security 的请求安全策略,所以导致的 /user/login 或其他接口出现 401/403 权限问题

正确操作:

让密码加密工具类继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法


再次发送注册请求,数据库中的密码即可显示为加密的状态



1.2在设置密码加密后,发送post登录请求,服务器出现报错java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not "opens java.lang.invoke" to unnamed module @dbf57b3


问题描述:

java.lang.reflect.InaccessibleObjectException 是一种反射相关的运行时异常,通常发生在尝试通过反射访问类的私有字段或方法时。这种错误的根本原因是 Java 的模块化系统 (JPMS, Java Platform Module System),自 Java 9 起引入。模块化的目的是增强封装性和安全性,因此默认情况下,某些包不会对外部模块开放其内部实现细节。

当程序试图通过反射修改 private final 字段(如 capturingClass 或其他类似的字段),而这些字段所在的模块未显式声明对其它模块开放时,就会抛出此异常。

InaccessibleObjectException 错误的原因

这个错误是由于 Java 模块系统的强封装性导致的,具体是 MyBatis-Plus 在尝试通过反射访问 java.lang.invoke.SerializedLambda 类的私有字段时被阻止。


询问了AI后,给出的答案是JDK版本与SpringBoot的版本不匹配:

  • 根据 Spring 官方文档和发布说明: Spring Boot 2.5.x 正式支持的最高 JDK 版本是 JDK 16

  • 使用 JDK 17 运行 Spring Boot 2.5.x 应用可能会导致以下问题: 反射访问异常(如 java.lang.reflect.InaccessibleObjectException) 模块系统限制(JPMS)引发的类加载失败 第三方库或插件不兼容 JDK 17 新特性

    于是我尝试将SpringBoot升级到更高版本,更稳定的版本2.7.18

but,仍旧报错....


继续修改,将MybatisPlus版本升级为更高的 3.5.0+ ,出现了一个新的问题,Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2025-05-07 17:45:08.072 ERROR 17712 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file


解决方案:

统一MybatisPlus的版本,这样就解决了所有问题

但在再次发送登录的请求后,虽然系统能正常运行但还是出现了异常:Unable to make field private final java.lang.Class...

于是,我将不再使用手动构造QureyWrapper,而是转换为 lambdaQuery().eq(...) ,之后的问题也就迎刃而解了。


1.3使用没有加密的密码登录,出现Encoded password does not look like BCrypt

原因:
  • 在发送登录请求中发送的密码在数据库中不是有效的BCrypt格式(可能存储的是明文或使用其他加密方式)
解决方案:

启动时自动迁移,即在系统启动时就检测有无密码未加密,若未加密,则进行加密

步骤:
  1. 添加一个数据迁移方法到 UserServiceImpl


说明: 使用 @PostConstruct 在 Bean 初始化后执行。 判断密码是否为 BCrypt 格式(如果不是则加密)。 更新数据库中的密码字段


实现效果:

成功将所有用户的密码进行加密!!

再次发送请求,登陆成功!!!!


2.广场发布动态遇到的问题

2.1在广场动态实体类中,我定义了一个属性imagesList,其目的是为了在上传多个图片时更好操作,但在上传图片文件时出现了报错,且在数据库中images列没有数据,Error updating database. Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'imageList'.


原因:
  1. 定义的imagesList在数据库中没有这个字段,而MyBatis Plus 会尝试将实体类中所有非空字段映射到数据库表字段,当他发现数据库中没有这个字段时就会报这个错,并且在业务逻辑类中调用了方法dynamic.setImageList(imageUrls);

解决方案:
  1. 确保 MyBatis 忽略 imageList 字段

  2. 避免设置 imageList 字段,即不要使用dynamic.setImageList(imageUrls);


最终实现效果:

忽视的细节:

上传文件时需要确认请求头是否为 Content-Type: multipart/form-data,否则也会导致数据库images为null的情况。


2.2文件超出默认大小限制,抛出Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:

The field images exceeds its maximum permitted size of 1048576 bytes.


解决方案:

修改 application.yml 中的上传大小限制

这样可以支持最大单个文件上传为 10MB,适用于大多数图片上传场景。

相关推荐
怡人蝶梦2 小时前
Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
java·jvm·redis·kafka·springboot·prometheus
瓯雅爱分享2 小时前
MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能
java·mysql·vue·软件工程·源代码管理
蓝色天空的银码星2 小时前
Springcloud Alibaba自定义负载均衡详解
spring·spring cloud·负载均衡
鬼多不菜2 小时前
一篇学习CSS的笔记
java·前端·css
深色風信子2 小时前
Eclipse 插件开发 5.3 编辑器 监听输入
java·eclipse·编辑器·编辑器 监听输入·插件 监听输入
lichenyang4532 小时前
使用react进行用户管理系统
数据库
Blossom.1183 小时前
人工智能在智能健康监测中的创新应用与未来趋势
java·人工智能·深度学习·机器学习·语音识别
木子.李3473 小时前
数据结构-算法学习C++(入门)
数据库·c++·学习·算法
shangjg33 小时前
Kafka 如何保证不重复消费
java·分布式·后端·kafka