Почему метод findById() не работает и выбрасывает ошибку?
Есть 1 сущность, есть репа, которая отвечает за CRUD-операции с этой сущностью. Методы save, findAll отрабатывают нормально, а findById выкидывает исключение, типа не может найти требуемый id для сущности.
В чем проблема?
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:755) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4]
at ru.home.kotlincoreexample.core.LaunchAppKt.main(LaunchApp.kt:27) ~[main/:na]
Caused by: java.lang.IllegalStateException: Required identifier property not found for class ru.home.kotlincoreexample.core.repository.domain.Person
at org.springframework.data.mapping.PersistentEntity.getRequiredIdProperty(PersistentEntity.java:135) ~[spring-data-commons-2.7.3.jar:2.7.3]
at org.springframework.data.r2dbc.repository.support.SimpleR2dbcRepository.lambda$new$0(SimpleR2dbcRepository.java:83) ~[spring-data-r2dbc-1.5.3.jar:1.5.3]
at org.springframework.data.util.Lazy.getNullable(Lazy.java:231) ~[spring-data-commons-2.7.3.jar:2.7.3]
at org.springframework.data.util.Lazy.get(Lazy.java:115) ~[spring-data-commons-2.7.3.jar:2.7.3]
at org.springframework.data.r2dbc.repository.support.SimpleR2dbcRepository.getIdProperty(SimpleR2dbcRepository.java:453) ~[spring-data-r2dbc-1.5.3.jar:1.5.3]
at org.springframework.data.r2dbc.repository.support.SimpleR2dbcRepository.getIdQuery(SimpleR2dbcRepository.java:457) ~[spring-data-r2dbc-1.5.3.jar:1.5.3]
at org.springframework.data.r2dbc.repository.support.SimpleR2dbcRepository.findById(SimpleR2dbcRepository.java:187) ~[spring-data-r2dbc-1.5.3.jar:1.5.3]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.7.3.jar:2.7.3]
LaunchApp.kt
package ru.home.kotlincoreexample.core
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import ru.home.kotlincoreexample.core.repository.domain.PersonRepository
@SpringBootApplication
class LaunchApp(var personRepository: PersonRepository) : CommandLineRunner {
override fun run(vararg args: String?) {
println("Person id = ${personRepository.findById(1L).block()}")
}
}
fun main(args: Array<String>) {
runApplication<LaunchApp>(*args)
}
Person.kt
package ru.home.kotlincoreexample.core.repository.domain
import lombok.ToString
import org.springframework.data.r2dbc.repository.R2dbcRepository
import org.springframework.stereotype.Repository
import javax.persistence.*
@Entity
@Table(name = "person")
@ToString
class Person(
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
val id: Long,
val name: String,
val age: Int,
val nationality: String
)
@Repository
interface PersonRepository : R2dbcRepository<Person, Long>
build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.7.4"
id("io.spring.dependency-management") version "1.0.14.RELEASE"
id ("org.jetbrains.kotlin.plugin.allopen") version "1.7.20"
kotlin("jvm") version "1.7.20"
kotlin("plugin.spring") version "1.7.20"
kotlin("plugin.jpa") version "1.7.20"
}
allOpen {
annotations("javax.persistence.Entity", "javax.persistence.MappedSuperclass", "javax.persistence.Embedabble")
}
group = "ru.abc"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
compileOnly("org.projectlombok:lombok")
runtimeOnly("org.postgresql:postgresql")
runtimeOnly("org.postgresql:r2dbc-postgresql")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("io.projectreactor:reactor-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
Ответы (1 шт):
Автор решения: User
→ Ссылка
import org.springframework.data.annotation.Id
import org.springframework.data.relational.core.mapping.Table
@Table(name = "tb_person")
data class Person (
@Id
var id: Long,
val name: String,
val age: Int,
val nationality: String
) {
Убрать из build.gradle.kts implementation("org.springframework.boot:spring-boot-starter-data-jpa")
И заменить аннотация из пакета import javax.persistence.* на import org.springframework.data.*