当前位置: 首页 > news >正文

使用BeanUtils返回前端为空值?

案例代码:

   public static <T> T beanConvert(Object from, Class<T> clazz, Converter converter) {if (from == null) return null;try {T t = clazz.newInstance();BeanCopier beanCopier = BeanCopier.create(from.getClass(), clazz, converter != null);beanCopier.copy(from, t, converter);return t;} catch (Exception e) {// 添加详细的异常日志System.err.println("BeanConvert failed: " + from.getClass().getName() + " -> " + clazz.getName());System.err.println("Exception: " + e.getMessage());e.printStackTrace();return null;}}

出现错误:

BeanConvert failed: com.ydc.business.admin.post.entity.YPostCategory -> com.ydc.business.admin.post.web.response.YPostCategoryListResponse
Exception: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @544fe44c
org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @544fe44c

错误分解:

1. BeanConvert failed: ...
  • 含义:程序尝试将一个对象(YPostCategory)转换为另一个对象(YPostCategoryListResponse),比如使用了 BeanUtils.copyProperties()、MapStruct、Dozer 或 Spring 的 BeanWrapper 等工具。
  • 这类转换在背后可能依赖 动态生成类(例如 CGLIB 动态代理或 ASM 字节码生成)。
2. Exception: java.lang.reflect.InaccessibleObjectException
  • 核心异常:Java 反射试图访问一个被模块系统保护的类或方法,但没有权限。
  • 具体是:尝试通过反射访问 ClassLoader.defineClass(...) 方法。
3. Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(...) accessible
  • CGLIB(或 ASM)等字节码生成库在运行时需要调用 ClassLoader.defineClass() 来定义新生成的类。
  • 该方法是 protected 的,正常情况下可以通过反射 setAccessible(true) 来访问。
  • 但在 Java 9 及以上版本引入了模块系统(JPMS) 后,如果模块没有显式 opens,即使使用反射也无法访问内部 API。
4. module java.base does not "opens java.lang" to unnamed module @...
  • java.base 是 Java 的核心模块,包含 java.lang 包。
  • 默认情况下,java.base 模块 不会向未命名模块(unnamed module)开放(opens) java.lang 包。
  • 你的应用运行在一个“未命名模块”中(典型的传统 classpath 应用),因此无法反射访问 java.lang.ClassLoader 的 protected 方法。
5. org.springframework.cglib.core.CodeGenerationException
  • Spring 使用的 CGLIB 库在生成动态类时失败,根本原因是上面的 InaccessibleObjectException

解决方法:

方案1: 添加JVM启动参数(最简单有效)

在你的IDE运行配置中添加JVM参数:

IntelliJ IDEA:

  1. 点击运行配置下拉菜单
  1. 选择 "Edit Configurations..."
  1. 找到你的Spring Boot运行配置
  1. 在 "VM options" 字段中添加:
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED

其他可选方案:

  1. 降级 JDK 版本(不推荐)

    • 使用 Java 8,它没有模块系统限制。
    • 但长期来看,应适配新版本 JDK。
  2. 避免使用 CGLIB(有时不可行)

    • 改用接口 + JDK 动态代理(要求被代理类实现接口)。
    • 例如:Spring AOP 中尽量使用接口。
  3. 升级依赖库版本

    • 确保你使用的 Spring、CGLIB、ASM 等库是较新版本,它们对 Java 16+ 的模块系统有更好的兼容性。
http://www.dtcms.com/a/389312.html

相关文章:

  • Windows Server数据库服务器安全加固
  • Linux TCP/IP调优实战,性能提升200%
  • Amazon ElastiCache:提升应用性能的云端缓存解决方案
  • 查找并替换 Excel 中的数据:Java 指南
  • 多线服务器具体是指什么?
  • Golang语言基础篇001_常量变量与数据类型
  • pytest文档1-环境准备与入门
  • MySQL 专题(四):MVCC(多版本并发控制)原理深度解析
  • 【开发者导航】在终端中运行任意图形应用:term.everything
  • [Python]pytest是什么?执行逻辑是什么?为什么要用它测试?
  • Nginx set指令不能使用在http块里,可以使用map指令
  • LeetCode 1759.统计同质子字符串的数目
  • 揭秘Linux文件管理与I/O重定向核心
  • 【PyTorch】DGL 报错FileNotFoundError: Cannot find DGL C++ graphbolt library
  • Autoware不同版本之间的区别
  • 多轮对话-上下文管理
  • 在阿里云私网服务器(无公网IP)上安装 Docker 环境的完整指南
  • opencv DNN模块及利用实现风格迁移
  • 多层感知机:从感知机到深度神经网络的演进
  • centos7 docker compose 安装redis
  • ⸢ 肆-Ⅱ⸥ ⤳ 风险发现体系的演进(下):实践与演进
  • 18兆欧超纯水抛光树脂
  • 第三篇:C++的进化之旅:从C with Class到C++20
  • 机器视觉的手机FPC丝印应用
  • 在Windows上使用Claude Code并集成到PyCharm IDE的完整指南
  • MoPKL与SPAR的思考
  • Ubuntu 启动分配不到 ip 地址问题
  • iOS 推送证书配置 - p12
  • Qt QVPieModelMapper详解
  • 【MySQL数据库管理问答题】第1章 MySQL 简介