Spring Boot Kotlin 找不到存储库 Bean

Posted

技术标签:

【中文标题】Spring Boot Kotlin 找不到存储库 Bean【英文标题】:Spring Boot Kotlin Cannot Find Repository Beans 【发布时间】:2021-06-09 01:52:03 【问题描述】:

我刚刚开始使用 Spring Boot + Kotlin,我正在尝试 JPA 的 PagingAndSortingRepository 接口,所以我编写了以下接口:

interface CustomerRepository : PagingAndSortingRepository<Customer, Long>

Customer 的型号如下:

@Entity
data class Customer(
    @Id @GeneratedValue var id: Long,
    var name: String
)

现在我正在尝试将其与CustomerService 连接起来,如下所示:

@Service
class CustomerService(
    private val customerRepository: CustomerRepository
) 
    fun getAllCustomers(): Collection<Customer> = customerRepository.findAll().toList()
    fun addCustomer(customer: Customer) = customerRepository.save(customer)
    fun deleteCustomer(customer: Customer) = customerRepository.delete(customer)
    fun updateCustomer(customer: Customer) = customerRepository.save(customer)

Application 看起来像这样:

@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories
class Application

fun main(args: Array<String>) 
    runApplication<Application>(*args)

我已经添加了我认为需要的依赖项,如下所示:

plugins 
    id("org.springframework.boot") version "2.5.0-SNAPSHOT"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    kotlin("jvm") version "1.4.30"
    kotlin("plugin.spring") version "1.4.30"


implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.apache.derby:derby:10.15.2.0")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

Spring Boot 无法找到一种有意义的 bean,因为我还没有定义它。但是阅读文档,看起来应该是由 Spring Boot 生成的:Spring Boot Data Repositories

Application.properties 是

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

我得到的错误信息是:

Description:
Parameter 0 of constructor in com.ubiquifydigital.crm.service.CustomerService required a bean named 'entityManagerFactory' that could not be found.

Action:
Consider defining a bean named 'entityManagerFactory' in your configuration.

我看到了一些关于此的不同帖子,并尝试添加 ConfigurationAutoConfigurationEnableJpaRepositories 注释,但这只会将错误更改为 entityManagerFactory not found 而不是 CustomerRepository not found。

【问题讨论】:

请关注***.com/questions/44411950/… 你链接的问题是关于设置德比。我对此没有任何问题。我已经删除了我谈到德比的部分,这是一个旁注,而不是我面临的问题 请显示 application.properties 我发布的问题包含我的 application.properties 和我在 gradle.kts 中的依赖项。我没有使用 Maven 为什么禁用DataSourceAutoConfiguration自动配置? 【参考方案1】:

当使用默认内存数据库时,您必须定义

spring.jpa.hibernate.ddl-auto=update

在 application.properties 中通知here。您还缺少 @Autowired 注释。 entityManagerFactory 丢失是因为默认的 auo 配置已关闭,在这种情况下,应用程序希望您执行所有必要的配置,而您又没有这样做。因此,请保持默认配置并更改您需要的内容。

此代码假定在单个文件中。

如果您有多个包,那么您可能需要按照link 中的说明添加 工作代码:

package com.example.demo

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import lombok.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository
import org.springframework.web.bind.annotation.*
import java.util.*
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.Table

@SpringBootApplication
open class SpringBootDerbyAppApplication

fun main(args: Array<String>) 
    runApplication<SpringBootDerbyAppApplication>(*args)



@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "applog")
internal class AppLog 
    @Id
    @GeneratedValue
    private val id: Long = 0

    @JsonProperty
    private val name: String? = null


@Configuration
open class ObjectMapperConfiguration 
    @Bean
    @Primary
    open fun objectMapper() = ObjectMapper().apply 
        registerModule(KotlinModule())
    


@RestController
@RequestMapping(path = ["/logs"])
internal class LogController @Autowired constructor(private val appLogRepository: AppLogRepository) 
    @GetMapping(path = ["/"])
    fun logs(): MutableIterable<AppLog> 
        return appLogRepository.findAll()
    

    @PostMapping(path = ["/"])
    fun add(@RequestBody appLog: AppLog): AppLog 
        appLogRepository.save(appLog)
        return appLog
    



@Repository
internal interface AppLogRepository : CrudRepository<AppLog, Long>

gradle 文件

plugins 
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.5.0-M1'


group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations 
    compileOnly 
        extendsFrom annotationProcessor
    


repositories 
    mavenCentral()
    maven  url 'https://dl.bintray.com/kotlin/kotlin-eap' 


dependencies 
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.apache.derby:derby'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")



test 
    useJUnitPlatform()

compileKotlin 
    kotlinOptions 
        jvmTarget = "1.8"
    

compileTestKotlin 
    kotlinOptions 
        jvmTarget = "1.8"
    


【讨论】:

谢谢,我会试试这个,让你知道。在新的 Spring 引导更改中,Kotlin 不需要 @Autowired。我已经能够创建在没有自动装配注释的情况下工作得很好的模拟类。 看起来只是使用运行时 derby 并更新应用程序配置修复了它。谢谢!

以上是关于Spring Boot Kotlin 找不到存储库 Bean的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gradle (Kotlin) 应用程序部署 Spring Boot - 找不到 jar

Spring Boot + Kotlin + Gradle - 错误:在类中找不到主要方法

Spring Boot 应用程序在控制器中找不到定义的存储库

找不到spring-boot可执行war密钥库

在 Spring Boot JPA 中找不到实体列名称

在带有 MongoDB 的 Spring Boot M7 中找不到 ReflectKotlinClass