You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails3升级Grails4时出现GrailsOpenSessionInViewInterceptor类找不到错误

Grails 3升级到Grails 4后启动报错:NoClassDefFoundError: GrailsOpenSessionInViewInterceptor

错误日志

java.lang.NoClassDefFoundError: org/grails/orm/hibernate5/support/GrailsOpenSessionInViewInterceptor
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at com.cmt.multitenant.CmtMultiTenantGrailsPlugin$_doWithSpring_closure1.doCall(CmtMultiTenantGrailsPlugin.groovy:50)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:399)
        at grails.spring.BeanBuilder.invokeBeanDefiningClosure(BeanBuilder.java:759)
        at grails.spring.BeanBuilder.beans(BeanBuilder.java:588)
        at grails.spring.BeanBuilder.invokeMethod(BeanBuilder.java:531)
        at org.grails.plugins.DefaultGrailsPlugin.doWithRuntimeConfiguration(DefaultGrailsPlugin.java:543)
        at org.grails.plugins.AbstractGrailsPluginManager.doRuntimeConfiguration(AbstractGrailsPluginManager.java:166)
        at grails.boot.config.GrailsApplicationPostProcessor.postProcessBeanDefinitionRegistry(GrailsApplicationPostProcessor.groovy:171)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:125)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:96)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:456)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:443)
        at grails.boot.GrailsApp$run.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
        at com.cmt.warranty.Application.main(Application.groovy:8)
Caused by: java.lang.ClassNotFoundException: org.grails.orm.hibernate5.support.GrailsOpenSessionInViewInterceptor
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        ... 45 common frames omitted

当前build.gradle依赖配置

dependencies {
//runtimeOnly("org.springframework.boot:spring-boot-devtools")
 runtimeOnly("org.grails:grails-datastore-gorm-support:$gormVersion")

implementation "org.springframework.boot:spring-boot-starter-logging"
implementation "org.springframework.boot:spring-boot-starter-actuator"
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.grails:grails-web-boot"
implementation "org.grails:grails-web-gsp"
implementation "org.grails.plugins:cache"
implementation "org.grails.plugins:scaffolding"
implementation "org.grails.plugins:views-json-templates"
implementation "org.grails:grails-datastore-gorm:$gormVersion"

testImplementation "org.grails:grails-web-testing-support"
testImplementation "org.springframework.boot:spring-boot-starter-test"

// Sub-project dependencies

compile project(":wt-core")
compile "com.cmt:gt3-assets:3.1.16"
compile "com.cmt:wt-shell:1.0", {
    transitive = false
}

//Spring
compile 'org.grails.plugins:spring-security-core:4.0.4'
implementation 'org.springframework.security:spring-security-acl:5.2.2.RELEASE'


//AWS
compile "org.grails.plugins:aws-sdk-s3:$awsSdkS3Version"
compile "com.amazonaws:aws-java-sdk-s3:1.11.375"

//CMT Plugins
compile "org.grails.plugins:cmt-multitenant:2.5.2-SNAPSHOT"
compile "org.grails.plugins:cmt-command:0.3-SNAPSHOT"
compile "org.grails.plugins:cmt-security:3.2.3-SNAPSHOT"


//Quartz Jobs
compile 'org.grails.plugins:quartz:2.0.13'

//Grails Plugins
compile 'org.grails.plugins:mail:3.0.0'
compile "io.github.gpc:asynchronous-mail:3.0.0"
compile 'org.grails.plugins:excel-export:2.1'
implementation 'com.jameskleeh:excel-builder:0.4.4'
compile "org.grails.plugins:database-migration:3.1.0.BUILD-SNAPSHOT"
compile 'org.grails.plugins:converters:4.0.0'

compile "org.grails:grails-datastore-rest-client:6.1.12.BUILD-SNAPSHOT"
//compile 'org.grails:grails-datastore-rest-client:5.0.0.RC2'

//unable to resolve class org.apache.poi.ss.usermodel....
implementation 'org.apache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'


//unable to resolve class org.jasig.cas.client.authentication.AttributePrincipal
//unable to resolve class org.springframework.security.cas.authentication.CasAuthenticationToken
implementation 'org.springframework.security:spring-security-cas:5.5.1'
implementation 'org.jasig.cas.client:cas-client-core:3.6.0'

//PDF
compile 'org.apache.pdfbox:pdfbox:2.0.24'

//LiquidBase
compile 'org.liquibase:liquibase-core:3.8.0'

//unable to resolve class org.apache.commons.io.IOUtils
compile 'commons-io:commons-io:2.10.0'

//Grails 4日期对象静态类型检查错误修复
implementation "org.codehaus.groovy:groovy-dateutil:2.5.6"

//Tests
testCompile "org.grails.plugins:build-test-data:3.3.0.RC2"
testCompile "org.grails:grails-gorm-testing-support"
testCompile "org.grails:grails-web-testing-support"
testCompile "org.grails.plugins:geb:1.1.2"
testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:2.47.1"
testCompile "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
}

Gradle环境信息

Build time:   2018-11-26 11:48:43 UTC
Revision:     7fc6e5abf2fc5fe0824aec8a0f5462664dbcd987

Kotlin DSL:   1.0.4
Kotlin:       1.3.10
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_302 (Amazon.com Inc. 25.302-b08)
OS:           Mac OS X 13.3.1 x86_64

解决方案

核心原因

Grails 4重构了Hibernate相关类的包路径:org.grails.orm.hibernate5.support.GrailsOpenSessionInViewInterceptor 被迁移到 org.grails.orm.hibernate.support.GrailsOpenSessionInViewInterceptor(移除了包名中的5)。而你使用的cmt-multitenant:2.5.2-SNAPSHOT插件是为Grails 3开发的,依赖了旧路径的类,导致类找不到。

解决步骤

  1. 升级CMT多租户插件
    更换为支持Grails 4的cmt-multitenant版本;如果没有官方兼容版本,需要修改插件代码:将插件中引用的org.grails.orm.hibernate5.support.GrailsOpenSessionInViewInterceptor替换为新路径。

  2. 对齐GORM版本
    Grails 4对应的GORM版本应为7.x系列,检查项目中$gormVersion变量的值,确保设置为7.0.x及以上的兼容版本。

  3. 补充必要依赖
    如果修改插件后仍缺少类,添加Grails ORM Hibernate依赖:

    implementation "org.grails:grails-orm-hibernate5:$grailsVersion"
    

    其中$grailsVersion需设置为你的Grails 4具体版本(如4.0.12)。

  4. 清理重建项目
    执行命令清理缓存并重新构建:

    ./gradlew clean build --refresh-dependencies
    

内容的提问来源于stack exchange,提问作者Dylan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:34:56