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

发布于:2025-05-12 ⋅ 阅读:(9) ⋅ 点赞:(0)

目录

爱生活小程序

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

InaccessibleObjectException 错误的原因

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


网站公告

今日签到

点亮在社区的每一天
去签到