BeanDefinitionParsingException尝试将JPA与Kotlin和Spring引导一起使用时出现异常
当我尝试使用springboot+JPA+kotlin+maven时,我遇到了这个异常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
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 { ... }