Spring Boot 3 with Kotlin在GraalVM上抛出java.lang.UnsupportedOpe



尝试在GraalVM上运行一个非常简单的Spring Boot 3应用程序。应用程序只是在启动时在H2中存储一些数据。这与Josh在Spring提示中所做的关于提前编译的基本相同,但使用Kotlin而不是Java。

当启动本机映像时,我在Spring启动后得到以下错误:

java.lang.UnsupportedOperationException: Kotlin class com.example.demo.basics.Customer has no .copy(…) method for property id
at org.springframework.data.mapping.model.BeanWrapper$KotlinCopyUtil.setProperty(BeanWrapper.java:171) ~[na:na]
at org.springframework.data.mapping.model.BeanWrapper.setProperty(BeanWrapper.java:79) ~[na:na]
...

我对GraalVM和Spring Native Images很陌生,不知道我是否缺少一些在使用Kotlin和Spring时需要配置的基本内容。数据类缺少的复制方法应该是由Kotlin生成的,所以我猜是与Kotlin相关的本机编译特别遗漏了一些东西。

失败的代码是以下类:

@Configuration
class BasicsConfiguration {
@Bean // execute on application start
fun basicsApplicationListener(customerRepository: CustomerRepository): ApplicationListener<ApplicationReadyEvent> {
return ApplicationListener<ApplicationReadyEvent> {
// store some values in the database
customerRepository
.saveAll(listOf("A", "B", "C").map { Customer(null, it) })
.forEach { println(it) }
}
}
}
interface CustomerRepository : CrudRepository<Customer, Int>
data class Customer(@Id val id: Long?, val name: String)

在JDK上运行应用程序非常好:./gradlew bootRun

2022-11-30T11:23:15.300+01:00  INFO 33997 --- [           main] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt in 2.383 seconds (process running for 2.733)
Customer(id=1, name=A)
Customer(id=2, name=B)
Customer(id=3, name=C)

本机映像也已成功创建:./gradlew nativeCompile

启动本机映像工作,服务器进程启动但随后失败:

2022-11-30T11:08:11.085+01:00  INFO 33059 --- [           main] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt in 0.147 seconds (process running for 0.158)
2022-11-30T11:08:11.089+01:00 ERROR 33059 --- [           main] o.s.boot.SpringApplication               : Application run failed
java.lang.UnsupportedOperationException: Kotlin class com.example.demo.basics.Customer has no .copy(…) method for property id
at org.springframework.data.mapping.model.BeanWrapper$KotlinCopyUtil.setProperty(BeanWrapper.java:171) ~[na:na]
at org.springframework.data.mapping.model.BeanWrapper.setProperty(BeanWrapper.java:79) ~[na:na]
...
<代码>

似乎这是Spring Data的问题,它没有为本机图像创建提供所有必要的反射提示。特别是缺少数据类的reflect-config.json方法的反射配置。将(可能)在Spring 6.0.3版本中修复,详细信息请参阅此问题:https://github.com/spring-projects/spring-framework/issues/29593

解决方法:在CC_5中为给定的数据类添加这样的东西:

PP_6

相关内容

最新更新