当与 Spring 数据和 @Entity 一起使用时,Kotlin class 继承为 'gradle build' 抛出错误

Kotlin class inheritance throws error for 'gradle build' when used with Spring Data & @Entity

我有一个名为 Character 的简单实体,看起来像这样:

import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "\"character\"")
class Character(
    @Id
    val id: String,
    val name: String,
    position: Position,
) : GameEntity(position) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as Character

        if (id != other.id) return false

        return true
    }

    override fun hashCode(): Int {
        return id.hashCode()
    }

    override fun toString(): String {
        return "Character(id='$id', name='$name', position=$position)"
    }

}

它源自 GameEntity 就是这样:

open class GameEntity(
    val position: Position
)

当我运行gradle clean build抛出以下异常

java.lang.IllegalStateException: No noarg super constructor for CLASS CLASS name:Character modality:OPEN visibility:public superTypes:[com.barbarus.state.entity.GameEntity]:
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB visibility:public <> (position:com.barbarus.state.entity.Position) returnType:com.barbarus.state.entity.GameEntity [primary]
    at org.jetbrains.kotlin.noarg.NoArgIrTransformer.getOrGenerateNoArgConstructor(NoArgIrGenerationExtension.kt:66)
    at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:51)
    at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:44)
    at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
    at org.jetbrains.kotlin.noarg.NoArgIrTransformer.visitClass(NoArgIrGenerationExtension.kt:33)
    at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:55
[...]

在我看来,您需要向 GameEntity class 添加一个无参数构造函数,如下所示:

open class GameEntity(val position: String) {
    constructor(): this("")
}

关于 Character 可能也是如此,因为 JPA 要求在 JPA 实体中提供无参数构造函数:

An entity class must follow these requirements.

  • The class must be annotated with the javax.persistence.Entity annotation.
  • The class must have a public or protected, no-argument constructor. The class may have other constructors.
  • (...)

您可以在 https://docs.oracle.com/javaee/7/tutorial/persistence-intro001.htm 阅读更多内容。