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.
我看到了一些关于此的不同帖子,并尝试添加 Configuration
、AutoConfiguration
和 EnableJpaRepositories
注释,但这只会将错误更改为 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 - 错误:在类中找不到主要方法