Расширение Spring Data CoroutineCrudRepository вызывает исключение PropertyReferenceException

#kotlin #spring-data-jpa #spring-data #kotlin-coroutines

#kotlin #spring-data-jpa #spring-данные #kotlin-сопрограммы

Вопрос:

В моем проекте у меня есть репозиторий с поддержкой JPA Kotlin ( 1.3.72 ) Spring Boot ( 2.3.3.RELEASE ), который работает просто отлично, контекст приложения Spring запускается нормально, проект проходит все тесты и т.д. и т.п.:

 @Repository
interface MappingRepository : CrudRepository<RoutingMapping, Long> {
    fun findByCompanyId(companyId: Long): RoutingMapping?
}
  

когда я переключаю его на расширение org.springframework.data.repository.kotlin.CoroutineCrudRepository вот так, не меняя ничего другого:

 @Repository
interface MappingRepository : CoroutineCrudRepository<RoutingMapping, Long> {
    fun findByCompanyId(companyId: Long): RoutingMapping?
}
  

запуск контекста приложения Spring завершается ошибкой при запуске и выдает следующее:

 Caused by: org.springframework.data.mapping.PropertyReferenceException:
No property count found for type RoutingMapping!`
  

Это сбивающее с толку исключение, поскольку RoutingMapping является отображенным @Entity . Я не совсем понимаю, не хватает ли мне чего-то на @Entity стороне или это мое непонимание того, как использовать org.springframework.data.repository.kotlin.CoroutineCrudRepository .


 Caused by: org.springframework.data.mapping.PropertyReferenceException: No property count found for type RoutingMapping!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:382)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358)
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:311)
    at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:293)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:276)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:82)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:251)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:252)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:381)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:382)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:94)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:89)
    ... 137 more
  

Комментарии:

1. Я не уверен, связано ли это, но при возврате одного элемента из метода CoroutineCrudRepository метод должен быть отмечен suspend

2. Есть какие-либо обновления по этой проблеме, братан?

Ответ №1:

count — это один из методов, который необходимо реализовать при расширении CoroutineCrudRepository. Я предполагаю, что вы также пытаетесь вернуть этот интерфейс в одном из ваших классов реализации. Итак, если вы добавите это, это приведет к сбою с другими методами, поскольку это интерфейс. Вместо этого, чтобы заставить это работать, у вас может быть еще один интерфейс, который возвращается в ваши классы, где бы вы ни пытались реализовать этот интерфейс. Итак, например, у меня был бы другой интерфейс под названием MappingMongoRepository, который имеет абстрактные методы, такие же, как MappingRepository, и использует MappingMongoRepository, возвращаемый в моих классах.