目录
InaccessibleObjectException 错误的原因
1.3使用没有加密的密码登录,出现Encoded password does not look like BCrypt
爱生活小程序
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格式(可能存储的是明文或使用其他加密方式)
解决方案:
启动时自动迁移,即在系统启动时就检测有无密码未加密,若未加密,则进行加密
步骤:
添加一个数据迁移方法到 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'.
原因:
定义的imagesList在数据库中没有这个字段,而MyBatis Plus 会尝试将实体类中所有非空字段映射到数据库表字段,当他发现数据库中没有这个字段时就会报这个错,并且在业务逻辑类中调用了方法dynamic.setImageList(imageUrls);
解决方案:
确保 MyBatis 忽略 imageList 字段
避免设置 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,适用于大多数图片上传场景。