【问题标题】:The Right Why Database Seeder with kotlin x spring bootThe Right Why Database Seeder with kotlin x spring boot
【发布时间】:2018-10-14 09:48:12
【问题描述】:

今天我正在学习使用 kotlin 和 Spring Boot 构建 API。在rails和laravel中有一个数据库播种器的“工具”,我想知道在kotlin和spring boot中,我之前在google上搜索过,找到了这个答案https://stackoverflow.com/a/45324578/1297435,在spring boot中我们可以使用@EventListernerlike

@EventListener
    public void userSeeder(ContextRefreshedEvent event) {
        // my query
        // check query size and iteration
}

Spring Boot 中是这样,但在 kotlin 中有没有办法?

// main/kotlin/com.myapp.api/seeder/UserSeeder.kt
package com.myapp.api.seeder

import org.springframework.context.event.ContextRefreshedEvent
import com.myapp.api.repository.*
import com.myapp.api.model.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
interface EventListener

@Component
class UserSeeder {
    @Autowired
    lateinit var repository: UserRepository

    @EventListener
    fun seedUsername(event: ContextRefreshedEvent) {
        val users = repository.findByUsernameBlank()
        if (users == null || users!!.size <= 0) {
            // 
        } else {
            //
        }
    }
}

@EventListener 类在 kotlin 中不起作用还是正确?

Error:(15, 6) Kotlin: This class does not have a constructor

【问题讨论】:

  • 我不知道 spring-boot,但是你为什么不把那个 Java 代码翻译成 Kotlin 呢?喜欢@EventListener fun userSeeder(event : ContextRefreshedEvent) { /* do sth */ }?这应该与上面的 Java 代码完全相同
  • @msrd0 我明白了,但是如何在 kotlin 中使用 @EventListerner
  • 与Java中的方式相同(至少在方法上)?我认为唯一的区别是属性和文件注释
  • @msrd0 我尝试在 kotlin 中实现 @EventListerner,但出现错误,我已更新我的问题以放置我的 kotlin 播种器

标签: spring-boot kotlin


【解决方案1】:

您可能会遇到问题,因为您将 EventListener 定义为一个接口,而不是从 org.springframework.context.event 导入它。 (参见导入下方的interface EventListener

但你的实际问题是:我通常使用 org.springframework.boot.ApplicationRunner 来完成此类任务。

import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner

@Component
class UserSeeder(private val repository: UserRepository) : ApplicationRunner {

    override fun run(args: ApplicationArguments) {
        val users = repository.findByUsernameBlank()
        if (users == null || users!!.size <= 0) {
            //
        } else {
            //
        }
    }

}

顺便说一句:我还使用了基于构造函数的注入。

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多