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

Grails 4.1.2保存Spy对象报错:非已知持久化类型

保存Spock Spy代理的Grails领域类对象失败问题

在Grails 4.1.2中,保存被Spock Spy代理的领域类对象到数据库时失败,抛出NonPersistentTypeException,错误提示:

Object [Person : (unsaved)] cannot be persisted. It is not a known persistent type.

直接创建的Person对象可以正常保存,但通过Spy生成的代理对象无法完成持久化。实际项目中,先构建带数据的Person实例,再通过personObject = Spy(personObject)生成代理,同样触发该问题,使用Gradle 5.6.4版本。

相关代码示例

领域类 grails-app/domain/Person.groovy

class Person{

    String name = ""
    String surname = ""

    static mapping = {
        id generator: 'identity'
    }
}

测试类 src/test/groovy/PersonSpec.groovy

import grails.testing.gorm.DataTest
import spock.lang.Specification

class PersonSpec extends Specification implements DataTest {

    def setupSpec() {
        mockDomain Person
    }

    def "persist person"(){
        setup:
        Person person = new Person()
        when:
        person.save()
        then:
        true
    }

    def "persist spy"(){
        setup:
            Person person = Spy()
        when:
            person.save()
        then:
            true
    }
}

构建配置 build.gradle

buildscript {
    repositories {
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
    }
}
repositories {
    maven { url "https://repo.grails.org/grails/core" }
}
version "0.1"
group "testapp"
apply plugin:"org.grails.grails-web"
dependencies {
    compile "org.grails.plugins:hibernate5"
    testCompile "org.grails:grails-gorm-testing-support"
}

版本配置 gradle.properties

grailsVersion=4.1.2

疑问

  • 该问题是否属于预期行为?
  • 有没有可行的解决办法?
  • 这是否是Grails或相关组件的Bug?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:20