我正在尝试使用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的函数?
1条答案
按热度按时间thtygnil1#
您通常不会自己实现存储库接口:你让Spring来帮你!
首先,定义您的接口,如您所做的那样:
在 Kotlin中,你可以在主构造函数中自动连接一个该类型的属性,例如:
或者作为一个普通属性(在这种情况下,因为不能指定初始值,所以必须将属性设置为
var
;它必须是可空的(在任何地方使用它都需要!!
),或者最好将其设置为lateinit
。)然后Spring将创建一些实现该接口的合成类,并将您的属性设置为它。 (您不需要担心 * 它是如何 * 做到这一点的--就像您不需要担心它所做的所有其他魔术一样,其中大部分都涉及创建合成子类。 这就是为什么Spring对象通常需要被做成
open
--以及为什么有'这是一个Spring plugin,它负责执行此操作。)更常见的做法是在服务类中使用仓库,然后从控制器类中调用 that-至少,这种模式的伸缩性更好,更容易跟踪和测试。 但直接这样做也应该可以。 无论哪种方式,你都可以调用你需要的任何仓库方法,例如
movieRepository.findAll()
。参见Spring文档;他们使用Java,但转换为Kotlin通常很简单。