java - Wildfly 和 Mybatis 存在延迟加载异常

标签 java lazy-loading classloader mybatis wildfly

我遇到的问题类似于以下内容:Jboss Wildfly EJB3 and Mybatis Deployment Error: NoSuchMethodError javax.persistence.Table.indexes()[Ljavax/persistence/Index;但这并不能阻止我部署 EAR,当我尝试在 DAO 中执行一个方法时,就会出现问题,该方法使用 MyBatis 映射器以及对另一个映射器的延迟加载引用。我收到以下异常:

java.lang.IllegalStateException: Cannot enable lazy loading because CGLIB is not available. Add CGLIB to your classpath.
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26) [mybatis.jar:3.2.8]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:111) [mybatis.jar:3.2.8]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102) [mybatis.jar:3.2.8]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98) [mybatis.jar:3.2.8]
    at coza.healthbridge.sharedservices.dao.AbstractDAO.getAll(AbstractDAO.java:141) [shared-services-ejb.jar:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_20]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_20]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_20]
    at java.lang.reflect.Method.invoke(Method.java:483) [rt.jar:1.8.0_20]
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82) [wildfly-weld-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) [wildfly-weld-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) [wildfly-weld-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) [wildfly-ee-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.ejb3.component.interceptors.NonPooledEJBComponentInstanceAssociatingInterceptor.processInvocation(NonPooledEJBComponentInstanceAssociatingInterceptor.java:59) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:251) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
    ... 215 more
Caused by: java.lang.IllegalStateException: Cannot enable lazy loading because CGLIB is not available. Add CGLIB to your classpath.
    at org.apache.ibatis.executor.loader.cglib.CglibProxyFactory.<init>(CglibProxyFactory.java:56) [mybatis.jar:3.2.8]
    at org.apache.ibatis.session.Configuration.getProxyFactory(Configuration.java:300) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:523) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:334) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:294) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:269) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:239) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:153) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:60) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:73) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.BatchExecutor.doQuery(BatchExecutor.java:87) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:137) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:96) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:77) [mybatis.jar:3.2.8]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:108) [mybatis.jar:3.2.8]
    ... 253 more
Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184) [cglib.jar:]
    at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66) [cglib.jar:]
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69) [cglib.jar:]
    at java.lang.Class.forName0(Native Method) [rt.jar:1.8.0_20]
    at java.lang.Class.forName(Class.java:340) [rt.jar:1.8.0_20]
    at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:178) [mybatis.jar:3.2.8]
    at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89) [mybatis.jar:3.2.8]
    at org.apache.ibatis.io.Resources.classForName(Resources.java:256) [mybatis.jar:3.2.8]
    at org.apache.ibatis.executor.loader.cglib.CglibProxyFactory.<init>(CglibProxyFactory.java:54) [mybatis.jar:3.2.8]
    ... 268 more


我的 pom.xml 具有以下依赖项:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <scope>compile</scope>
</dependency>
<!-- Proxy support (Mandatory) -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Internal dependency (Required) -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm-util</artifactId>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Internal dependency (Required) -->
<dependency>
    <groupId>opensymphony</groupId>
    <artifactId>oscache</artifactId>
    <scope>compile</scope>
    <!-- This excludes the transitive dependency on JMS -->
    <exclusions>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>jms</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这确实很棘手,因为 Jboss 7 中的 EAR 的工作原理与该方法完全相同。我还知道jboss基本系统中有一个内置的asm模块(模块xmlns =“urn:jboss:module:1.3”name =“asm.asm”)。如果我将 asm.jar 添加回我的 EAR 中,我会从上面提到的帖子中得到部署错误,因为 asm 模块是由 jboss 本身加载的。由于该应用程序在 JBoss 7 中运行,我知道我的 mybatis-config.xml、映射器和实体 POJOS 都很好。我猜测这是某种 JBoss Wildfly 类加载特定问题。

最佳答案

这是我自己解决问题的方法,因为我无法在任何地方找到我的问题的答案。
在研究了 JBoss Wildfly 类加载的工作原理之后,我发现了全局模块概念 https://docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly (滚动到全局模块标题)。

经过一番调整和摆弄我的standalone.xml后,我找到了解决方案。

您必须搜索 java ee 子系统(无论版本如何 urn:jboss:domain:ee:2.0 urn:jboss:domain:ee:1.0)并为 asm.asm 模块添加全局模块标记,如下所示:

<global-modules>
    <module name="asm.asm" slot="main" />
</global-modules>

使用 asm.asm 模块作为全局模块重新启动我的 jboss 后,我的应用程序就像在 JBoss 7 中一样运行。

关于java - Wildfly 和 Mybatis 存在延迟加载异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778692/

相关文章:

Java 6 - 将 java.sql.Types 映射到 Java 类型

c# - 如何对实例变量使用惰性

javascript - 图像延迟加载会引发错误

java - 如何知道一个类是否已经初始化?

java - ClassLoader不加载内部类

java - 在 Ubuntu 中设置 JAVA_HOME 以指向 Window 的 JAVA_HOME

java - iptables icmp 目标主机未知

reactjs - Webpack 和 React.lazy 没有拆分动态导入。为什么?

带有目录/包的defineClass的Java ClassLoader格式?

java - 我应该使用 AsyncTask 还是 IntentService 进行 REST API 调用?