BeanDefinitionParsingException尝试将JPA与Kotlin和Spring引导一起使用时出现异常

BeanDefinitionParsingException尝试将JPA与Kotlin和Spring引导一起使用时出现异常,spring,maven,jpa,spring-boot,kotlin,Spring,Maven,Jpa,Spring Boot,Kotlin,当我尝试使用springboot+JPA+kotlin+maven时,我遇到了这个异常 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Bean method 'init' must not be private or final; change the method's modifiers to continue Offending resou

当我尝试使用springboot+JPA+kotlin+maven时,我遇到了这个异常

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: 
Configuration problem: @Bean method 'init' must not be private or final; 
change the method's modifiers to continue
Offending resource: com.wirecard.kotlin.jpa.Application
at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70)
at org.springframework.context.annotation.BeanMethod.validate(BeanMethod.java:50)
at org.springframework.context.annotation.ConfigurationClass.validate(ConfigurationClass.java:219)
at org.springframework.context.annotation.ConfigurationClassParser.validate(ConfigurationClassParser.java:528)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:307)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:239)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.wirecard.kotlin.jpa.ApplicationKt.main(Application.kt:50)
我在这个链接中遵循了这个示例,但它是使用Gradle构建的

该代码由3个类组成

类客户 类客户控制器 接口客户存储库
import org.springframework.data.repository.crudepository
接口CustomerRepository:CrudRepository{
fun findByLastName(lastName:String):Iterable
}

从日志中可以看出,您遇到的问题实际上是第四个类,
应用程序。它说该类中的
init
方法不应该是
private
final
,这里的问题是后者-默认情况下,Kotlin中的函数和类是
final

您可以使用
open
关键字将该方法标记为非最终方法

@Bean
open fun init(repository: CustomerRepository) = CommandLineRunner { ... }
@SpringBootApplication
open class Application { ... }
您还必须使用
open
关键字标记
应用程序

@Bean
open fun init(repository: CustomerRepository) = CommandLineRunner { ... }
@SpringBootApplication
open class Application { ... }

示例中没有这些
open
关键字的原因是它使用了plugin(),它打开了Spring要求的非最终类和函数

如果你不想手动打开你的类,那么你也可以将
kotlin-spring
插件与Maven一起使用。这样做的说明就在Gradle说明的正上方,在关于插件一章的末尾。您只需包含那里的代码,并将
all open
替换为
spring
,如注释所述

@SpringBootApplication
open class Application { ... }