【问题标题】:lateinit property vkUserRepository has not been initialized. Why?lateinit 属性 vkUserRepository 尚未初始化。为什么?
【发布时间】:2019-05-22 14:06:02
【问题描述】:

我尝试“kotlin - spring boot 2 - jpa”。我刚开始学习 spring-boot。 我有模型、存储库和应用程序文件。我使用 start.spring.io 来启动。我看过 web 的示例,但我不需要 web。

编译时出错。为什么 ? 我该如何解决这个错误?

2018-12-21 13:26:02.732  INFO 28188 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2018-12-21 13:26:02.923  INFO 28188 --- [           main] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
2018-12-21 13:26:02.929  INFO 28188 --- [           main] org.hibernate.type.BasicTypeRegistry     : HHH000270: Type registration [java.util.UUID] overrides previous :         org.hibernate.type.UUIDBinaryType@396ef8b2
2018-12-21 13:26:03.335  INFO 28188 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-12-21 13:26:04.150  INFO 28188 --- [           main] r.k.v.VkUsersSkillApplicationKt          : Started VkUsersSkillApplicationKt in 4.348 seconds (JVM running for 4.905)
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property vkUserRepository has not been initialized
  at     ru.program.vkUsersSkill.VkUsersSkillApplicationKt.main(VkUsersSkillApplication.kt:17)

我的程序:

VkUser.kt

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

@Entity
@Table (name = "vk_users")
data class VkUser(
    @Id
    @Column(name = "user_id")
    var userId: Long = 0L,

    @Column(name = "access_token")
    var accessToken: String = "",

    @Column(name = "alias")
    var alias: String = "",

    @Column(name = "login")
    var login: String = "",

    @Column(name = "password")
    var password: String = ""
)

VkUserRepository.kt

import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import ru.program.vkUsersSkill.models.VkUser

@Repository
interface VkUserRepository: JpaRepository<VkUser, Long>

VkUsersSkillApplication.kt

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import ru.program.vkUsersSkill.repositories.VkUserRepository

@Autowired
lateinit var vkUserRepository: VkUserRepository

@SpringBootApplication
class VkUsersSkillApplication

fun main(args: Array<String>) {
  runApplication<VkUsersSkillApplication>(*args)
  vkUserRepository.findAll()
}

application.properties

spring.jpa.database-platform =org.hibernate.dialect.PostgreSQL95Dialect
spring.datasource.url=jdbc:postgresql://localhost:5432/vkadmin
spring.datasource.username=vkadmin
spring.datasource.password=pass 
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

【问题讨论】:

  • 你能发布 application.properties 吗?
  • @Jonathan Johx,添加了属性文件。
  • 添加 VkUsersSkillApplication 类头 @EntityScan(basePackages = {"run.program.xxxxx.entities" }) @EnableJpaRepositories(basePackages = {"ru.program.xxxxx.repositories"}) ...分别更改你的包
  • @Jonathan Johx,这是行不通的(((错误没有改变。屏幕在这里s8.hostingkartinok.com/uploads/images/2018/12/…
  • 您不能在应用程序类中调用某个存储库,为什么?因为您正在启动应用程序并且它还没有加载您的应用程序,所以删除这些变量和逻辑,如果您想加载数据或从存储库获取您需要在应用程序运行后实现一些类...

标签: spring-boot jpa kotlin spring-data-jpa


【解决方案1】:

我们可以创建启动类bean

@Component
class StartHere {
@Autowired
lateinit var vkUserRepository: VkUserRepository
fun runHere() {
    var users = vkUserRepository.findAll()
    println(users)
}

//TODO all other program code here
}

然后在 MAIN 函数中,我们获取“应用程序上下文”并运行我们的 bean-starter

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import ru.program.vkUsersSkill.init.StartHere

@SpringBootApplication
class VkUsersSkillApplication

fun main(args: Array<String>) {
val context = runApplication<VkUsersSkillApplication>(*args)
val start = context.getBean(StartHere::class.java)
start.runHere()
}

一切都完成了。 感谢@Jonathan Johx。

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2020-12-31
    • 2021-06-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多