Spring Boot+Apache Wicket注入@SpringBean时触发InaccessibleObjectException错误
问题排查:Spring Boot + Apache Wicket注入MongoDBService时的CGLib错误
在学习Spring Boot + Apache Wicket过程中,在HomePage.java中通过@SpringBean注入MongoDBService后,程序启动报错。
相关代码
HomePage.java
import app.services.MongoDBService; import app.web.pages.BasePage; import com.giffing.wicket.spring.boot.context.scan.WicketHomePage; import lombok.extern.slf4j.Slf4j; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.spring.injection.annot.SpringBean; import org.wicketstuff.annotation.mount.MountPath; @WicketHomePage @MountPath(value = "home", alt = {"home2"}) @Slf4j public class HomePage extends BasePage { @SpringBean private MongoDBService mongoDBService; public HomePage() { Label label = new Label("label", "My custom page title from Wicket! "+mongoDBService.getRepo().count()); add(label); } }
BasePage.java
public abstract class BasePage extends WebPage { public BasePage(PageParameters params){ super(params); Injector.get().inject(this); initPage(); } public BasePage(){ Injector.get().inject(this); initPage(); } private void initPage(){ } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(JavaScriptHeaderItem.forReference(getApplication().getJavaScriptLibrarySettings().getJQueryReference())); response.render(JavaScriptHeaderItem.forReference(getApplication().getJavaScriptLibrarySettings().getWicketAjaxReference())); response.render(JavaScriptHeaderItem.forUrl("https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js")); response.render(CssHeaderItem.forUrl("https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css")); } }
MongoDBService.java
@Service @Slf4j public class MongoDBService { @Autowired @Getter private TodoMongoDBRepository repo; @PostConstruct void setup() { log.info("+++ MongoDB database is starting ..."); repo.deleteAll(); for (int i = 1; i <= 8; i++) { Todo todo = new Todo(); todo.setTitle("Todo number " + i); todo.setBody("Body number " + i); addToItems(todo); } } public List<Todo> getAllItems() { return StreamSupport.stream(repo.findAll().spliterator(), false) .collect(Collectors.toList()); } public void addToItems(Todo todo) { repo.save(todo); } public void removeItems(List<Todo> items) { repo.deleteAll(items); } }
报错信息
Caused by: net.sf.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 @58c1670b at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:464) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:96) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:94) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) ~[cglib-3.3.0.jar:na] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:119) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:174) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:153) ~[cglib-3.3.0.jar:na] at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:73) ~[cglib-3.3.0.jar:na] ... 72 common frames omitted Caused by: 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 @58c1670b at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na] at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na] at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[na:na] at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) ~[na:na] at net.sf.cglib.core.ReflectUtils$1.run(ReflectUtils.java:61) ~[cglib-3.3.0.jar:na] at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) ~[na:na] at net.sf.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:52) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) ~[cglib-3.3.0.jar:na] at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:332) ~[cglib-3.3.0.jar:na] ... 84 common frames omitted
错误原因
- 核心问题是旧版本CGLib与Java 9+模块系统不兼容:当前使用的CGLib 3.3.0版本,在Java 9及以上的JPMS(Java Platform Module System)环境下,无法通过反射访问
java.lang.ClassLoader的defineClass方法——因为java.base模块默认不会向未命名模块开放java.lang包的反射权限。 - Wicket的Spring注入机制依赖CGLib生成代理类,旧版本CGLib没有适配JPMS的权限规则,导致反射调用失败。
解决方法
1. 升级CGLib版本(推荐)
将CGLib依赖升级到3.4.0及以上版本,新版本已适配Java 9+的模块系统。
- Maven配置:
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.4.0</version> </dependency>
- Gradle配置:
implementation 'cglib:cglib:3.4.0'
2. 添加Java启动参数(临时 workaround)
如果暂时无法升级依赖,可以在启动应用时添加JPMS权限开放参数,绕过模块系统限制:
--add-opens java.base/java.lang=ALL-UNNAMED
注意:这只是临时方案,长期建议优先升级依赖。
3. 检查Wicket Spring Starter版本
确保使用的com.giffing.wicket.spring.boot.starter是兼容Java 9+的稳定版本,它会自动管理兼容的CGLib依赖,避免版本冲突。
内容的提问来源于stack exchange,提问作者PAA
相关产品推荐
相关产品推荐

