BeanDefinitionParsingException при попытке использовать JPA с загрузкой Kotlin и Spring

Я получаю это исключение, когда я пытаюсь использовать 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

Приложение Springboot для kotlin и JPA

Код состоит из 3 классов

Клиент класса

 import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.GenerationType import javax.persistence.Id @Entity class Customer( val firstName: String, val lastName: String, @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long = -1) { override fun toString(): String { return "Customer(id=$id, firstName='$firstName', lastName='$lastName')" } } 

Класс CustomerController

 import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RestController @RestController class CustomerController(val repository:CustomerRepository) { @GetMapping("/") fun findAll() = repository.findAll() @GetMapping("/{lastName}") fun findByLastName(@PathVariable lastName:String) = repository.findByLastName(lastName) } 

Интерфейс CustomerRepository

 import org.springframework.data.repository.CrudRepository interface CustomerRepository : CrudRepository<Customer, Long> { fun findByLastName(lastName: String): Iterable<Customer> } 

Из журнала это похоже, что это действительно 4-й класс, Application , с которым у вас возникла проблема. В нем говорится, что метод init в этом классе не должен быть private или final , ваша проблема здесь будет последней – функции и классы в Kotlin являются final по умолчанию.

Вы можете сделать этот метод недействительным, пометив его ключевым словом open .

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

Вы также должны будете пометить свой класс Application ключевым словом open .

 @SpringBootApplication open class Application { ... } 

Причина, по которой эти open ключевые слова не приведены в примере, заключается в том, что в ней используется плагин kotlin-spring ( см. Скрипт сборки ), который открывает классы и функции, которые Spring требует, чтобы они не были окончательными.

Вы также должны использовать плагин kotlin-spring с Maven, если вы не хотите вручную open свои классы. Инструкции для этого находятся прямо над инструкциями Gradle, в конце главы о вскрытом плагине. Вам просто нужно включить код, который есть, и заменить <plugin>all-open</plugin> на <plugin>spring</plugin> , как описывает комментарий.