BeanDefinitionParsingException cuando se intenta usar JPA con Kotlin y Spring boot

Obtengo esta exception cuando bash usar 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) 

Seguí el ejemplo en este enlace pero está construido usando Gradle

Aplicación de Springboot para Kotlin y JPA

El código consta de 3 classs

Cliente de class

 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')" } } 

Class 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) } 

Interfaz CustomerRepository

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

Desde el logging, parece que en realidad es la 4ª class, Application , con la que tiene un problema. Dice que el método init en esa class no debe ser private o final , tu problema aquí sería el último: las funciones y classs en Kotlin son final por defecto.

Puede hacer que el método no sea final marcándolo con la palabra key open .

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

También deberá marcar su class de Application con la palabra key open .

 @SpringBootApplication open class Application { ... } 

La razón por la que estas palabras key open no están en el ejemplo es porque usa el kotlin-spring ( ver en el script de compilation ), que abre las classs y funciones que Spring requiere que sean no finales.

También debería poder utilizar el kotlin-spring con Maven, si no desea que sus classs se open manualmente. Las instrucciones para hacerlo están justo encima de las instrucciones de Gradle, al final del capítulo sobre el complemento completamente all-open . Solo tiene que include el código que está allí y replace <plugin>all-open</plugin> con <plugin>spring</plugin> , como se describe en el comentario.

  • aplicación kotlin springboot - ¿por qué no funciona con cuerpo de expresión?
  • No se pudieron detectar las classs de configuration pnetworkingeterminadas para la class de testing con Kotlin y @AutoConfigureMockMvc
  • Cómo registrar los cuerpos de request y respuesta en Spring WebFlux