spring - 尝试将 JPA 与 Kotlin 和 Spring boot 结合使用时出现 BeanDefinitionParsingException

标签 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 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 application for kotlin and 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')"
    }
}

客户 Controller 类

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

接口(interface)CustomerRepository
import org.springframework.data.repository.CrudRepository

interface CustomerRepository : CrudRepository<Customer, Long> {

    fun findByLastName(lastName: String): Iterable<Customer>
}

最佳答案

从日志来看,它实际上是第 4 类,Application ,你遇到了问题。它说init该类中的方法不应该是 privatefinal ,你的问题是后者 - Kotlin 中的函数和类是 final默认情况下。

您可以通过使用 open 标记该方法来使其成为非 final方法。关键字。

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

您还必须标记您的 Applicationopen 一起上课关键字。

@SpringBootApplication
open class Application { ... }

原因是这些open关键字不在示例中是因为它使用 kotlin-spring 插件 ( see in the build script ),它打开 Spring 要求非最终的类和函数。

您应该能够使用kotlin-spring如果您不想手动创建类,也可以使用 Maven 插件 open 。执行此操作的说明位于 Gradle 说明的正上方,位于有关 all-open 的章节末尾。插入。您只需包含那里的代码,然后替换 <plugin>all-open</plugin><plugin>spring</plugin> ,正如评论中所描述的那样。

关于spring - 尝试将 JPA 与 Kotlin 和 Spring boot 结合使用时出现 BeanDefinitionParsingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44245474/

相关文章:

java - 无法将 spring jpa 与 Oracle 连接

java - Spring 工具套件 - ClassNotFoundException : oracle. jdbc.driver.OracleDriver

html 文件的 <head> 中的 Javascript 不起作用

java - JPA 命名约定

mysql - 在 Spring Boot 中动态向 MySQL 添加新列

java - 向服务发送表单

java - 通过spring AOP + Aspectj进行异常处理

java - spring中如何使用@Transactional注解加入父事务

maven:远程开发下线后上线

xml - org.xml.sax.SAXParseExceptionpublicId : http://xmlns. jcp.org/xml/ns/persistence/persistence_2_1.xsd