intellij-idea 在Kotlin中实现扩展到MongoRepository接口的接口时出现问题

9nvpjoqh  于 2022-11-01  发布在  Kotlin
关注(0)|答案(1)|浏览(143)

我正在尝试使用MongoRepository〈T,ID〉接口的内置方法与mongo交互。

interface MovieRepository : MongoRepository<Movie, String> {

}
但是,当我尝试使用类实现“MovieRepository”时,它要求我同时实现“MongoRepository”中定义的所有成员函数

class ControllerClass(private val MovieRepository: MovieRepository): MovieRepository {}

这是我初始化控制器类时得到的结果:
类'ControllerClass'不是抽象的,并且不实现抽象成员public abstract fun〈S:电影!〉保存(实体:S):S
有没有什么方法可以让我不需要在我的ControllerClass中再次定义所有MongoRepository的函数?

thtygnil

thtygnil1#

您通常不会自己实现存储库接口:你让Spring来帮你!
首先,定义您的接口,如您所做的那样:

interface MovieRepository : MongoRepository<Movie, String> {
    // Add any abstract methods you'll need here…
}

在 Kotlin中,你可以在主构造函数中自动连接一个该类型的属性,例如:

@Controller
class ControllerClass @Autowired constructor(
    private val movieRepository: MovieRepository
) {
    // …code…
}

或者作为一个普通属性(在这种情况下,因为不能指定初始值,所以必须将属性设置为var;它必须是可空的(在任何地方使用它都需要!!),或者最好将其设置为lateinit。)

@Controller
class ControllerClass {
     @Autowired private lateinit var movieRepository: MovieRepository

    // …code…
}

然后Spring将创建一些实现该接口的合成类,并将您的属性设置为它。 (您不需要担心 * 它是如何 * 做到这一点的--就像您不需要担心它所做的所有其他魔术一样,其中大部分都涉及创建合成子类。 这就是为什么Spring对象通常需要被做成open--以及为什么有'这是一个Spring plugin,它负责执行此操作。)
更常见的做法是在服务类中使用仓库,然后从控制器类中调用 that-至少,这种模式的伸缩性更好,更容易跟踪和测试。 但直接这样做也应该可以。 无论哪种方式,你都可以调用你需要的任何仓库方法,例如movieRepository.findAll()
参见Spring文档;他们使用Java,但转换为Kotlin通常很简单。

相关问题