findById with Quarkus, Mongodb and Panache raises the error: "This method is normally automatically overridden in subclasses"

findById with Quarkus, Mongodb and Panache raises the error: "This method is normally automatically overridden in subclasses"

我从 Quarkus 教程开始:https://quarkus.io/guides/mongodb-panache 学习如何在 Quarkus 中使用 Mongo,但是当我尝试使用 findByIdOptional 时我的实体存储在数据库中从 PanacheMongoRepository 开始,控制台显示此错误:

Caused by: java.lang.IllegalStateException: This method is normally automatically overridden in subclasses
    at io.quarkus.mongodb.panache.runtime.MongoOperations.implementationInjectionMissing(MongoOperations.java:633)
    at io.quarkus.mongodb.panache.PanacheMongoRepositoryBase.findByIdOptional(PanacheMongoRepositoryBase.java:102)
    at com.basketmaster.backend.common.infraestructure.CrudMongoRepository.findById(CrudMongoRepository.kt:25)
interface CrudRepository<M : Model<*>> {
    fun save(model: M): M
    fun findById(id: String): M
}

@ApplicationScoped
class CrudMongoRepository<M : Model<*>> : CrudRepository<M>, PanacheMongoRepository<M> {

    override fun save(model: M): M {
        persistOrUpdate(model)
        return model
    }

    override fun findById(id: String): M {
        val optional = super.findByIdOptional(ObjectId(id))
        return optional.orElseThrow { NotFoundException() }
    }

}

我注意到接口 PanacheMongoRepository 继承自 PanacheMongoRepositoryBase 但未实现 findByIdOptional:

public interface PanacheMongoRepositoryBase<Entity, Id> {
    // ...
    @GenerateBridge(targetReturnTypeErased = true)
    default Entity findById(Id id) {
        throw INSTANCE.implementationInjectionMissing();
    }
    @GenerateBridge
    default Optional<Entity> findByIdOptional(Id id) {
        throw INSTANCE.implementationInjectionMissing();
    }
}

我应该如何使用 Panache 通过 ID 查找实体?我不明白为什么这些方法没有实现,但教程使用了它们并且工作正常。

MongoDB 和 Panache entities/repositories 的方法是在构建时通过字节码生成实现的。

要做到这一点,您需要有一个实体/存储库,它具有具体参数类型而不是通用参数类型,因为扩展需要在构建时知道具体类型才能使用正确的参数化 MongoDB Collection.

所以在这里,问题是你不能直接使用你的 CrudMongoRepository,你需要将它子类化并提供具体的参数类型。