jBPM项目引入Gson依赖后无法访问数据对象的问题求助
问题根源
你碰到的java.lang.IllegalAccessError: tried to access class com.google.gson.internal.bind.TypeAdapters$22 from class com.google.gson.internal.bind.TypeAdapters$22$1本质是类加载器冲突:jBPM的Assets页面(Web界面)使用的类加载器,和流程运行时的类加载器不是同一个。你在项目里引入的Gson,与jBPM服务器内置的Gson(或其他依赖中包含的Gson)版本不兼容,导致Gson内部类的访问权限在跨类加载器场景下被限制,直接影响了Data Object的页面操作。
具体解决方法
1. 将Gson依赖设为仅运行时生效
在项目的依赖配置中(不管是Maven的pom.xml还是jBPM项目的依赖管理界面),把Gson的作用范围改成runtime。这样jBPM的Web界面类加载器不会加载该Gson依赖,只有流程运行阶段才会使用它,从根源避免冲突。
Maven配置示例:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>你使用的Gson版本号</version> <scope>runtime</scope> </dependency>
2. 排除jBPM内置的Gson依赖
如果jBPM服务器本身已包含Gson依赖,就在项目的依赖配置中排除内置的Gson,确保仅使用你指定的版本。比如在pom.xml中给jBPM核心依赖添加排除规则:
<dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-core</artifactId> <version>7.74.1.Final</version> <exclusions> <exclusion> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </exclusion> </exclusions> </dependency>
根据你实际引入的jBPM相关依赖,逐一排查并排除其中的Gson依赖。
3. 将Gson解析逻辑封装为独立Jar包
不要直接在Data Object的Java代码中编写Gson解析逻辑,而是把这部分代码抽离到单独的Java项目中,打包成Jar后部署到jBPM服务器的WEB-INF/lib目录(或通过jBPM的全局依赖管理添加)。这样Data Object只需调用封装好的方法,无需直接引用Gson类,全局类加载器加载该Jar后,Web界面和流程运行时都能正常访问,不会出现类加载冲突。
4. 改用jBPM内置的Jackson做JSON解析
jBPM基于的WildFly/EAP服务器本身内置了Jackson JSON解析库,直接用它替代Gson即可,无需额外添加依赖,自然不会产生冲突。示例代码:
import com.fasterxml.jackson.databind.ObjectMapper; // 将对象序列化为JSON字符串 ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(你的业务对象); // 将JSON字符串反序列化为对象 你的业务对象类型 obj = mapper.readValue(jsonStr, 你的业务对象类型.class);
内容的提问来源于stack exchange,提问作者Pedro

