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

目录

爱生活小程序

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,适用于大多数图片上传场景。

相关推荐
xyouyuweizhu26 分钟前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟37 分钟前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
liyi_hz20081 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3271 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
Random Glow1 小时前
二级索引与回表:一次回表到底多贵
数据库·mysql·性能优化·innodb·索引
Brilliantwxx2 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
CarIise2 小时前
JDBC 与数据库事务核心
数据库·笔记
见闻小天地2 小时前
新手入门:印刷包装设备的伺服和PLC运动控制方案各管什么?七步选型讲清楚
运维·网络·数据库·人工智能
鬼手点金2 小时前
KV Cache 未必是一次性的:可编辑、可组合的“笔记”
java·人工智能·笔记·学习·自动化·1024程序员节