Spring Webflux + JPA: реактивные репозитории не поддерживаются JPA - PullRequest
0 голосов
/ 24 сентября 2018

Я получаю сообщение об ошибке при запуске приложения JPA: Reactive Repositories are not supported by JPA. У моего Pom ниже зависимости, и я использую Spring Boot 2.0.5

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

, вот мой интерфейс хранилища.

public interface CustomerRepository extends ReactiveCrudRepository {
}

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

org.springframework.dao.InvalidDataAccessApiUsageException: Reactive Repositories are not supported by JPA. Offending repository is com.example.demo.CustomerRepository!
    at org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport.useRepositoryConfiguration(RepositoryConfigurationExtensionSupport.java:310) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport.getRepositoryConfigurations(RepositoryConfigurationExtensionSupport.java:103) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:126) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.registerBeanDefinitions(AbstractRepositoryConfigurationSourceSupport.java:60) ~[spring-boot-autoconfigure-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:358) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:1.8.0_144]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:357) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:145) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:271) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:91) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:61) ~[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]

Может кто-нибудь посоветовать, если JPA не поддерживается, тогда что мне следует использовать, любая помощь приветствуется ..

Ответы [ 4 ]

0 голосов
/ 09 июня 2019

Я не знаю о предыдущей поддержке, но по состоянию на 09 июня 2019 года вы можете абсолютно использовать WebFlux с репозиториями JPA!

Ваш стек не должен быть полностью реактивным.Мне нравится WebFlux, но мне нужна реляционная база данных.

У меня есть:

  • spring-boot-starter-data-redis-реактивный
  • spring-boot-starter-webflux
  • spring-boot-starter-data-jpa

edit: (FYI) код находится в Kotlin, но все равно должен работать в Java.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = ["com.example.core.repositories"])
@EnableJpaAuditing
class PersistenceConfig

src / core / models / User

@Entity
@Table(name = "user")
class User(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    var id: Long,

    @Column(name = "username")
    var username: String,

    @Column(name = "created_date", nullable = false, updatable = false)
    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    val createdDate: Date,

    @Column(name = "modified_date")
    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    val modifiedDate: Date
) : Serializable {

    /**
     * This constructor is not to be used. This is for hibernate,
     * which requires an empty constructor.
     */
    constructor() : this(1L, "", "", Date(), Date())

    companion object {
        private const val serialVersionUID = 2398467923L
    }

}

Я получил ту же ошибку JPA: Reactive Repositories are not supported by JPA., когда все еще возвращал моно объекты из запроса Spring Dataкак Mono<User>.Однако, если вы удалите оболочку Mono, она будет работать нормально.

src / core / repositories / UserRepository

@Repository
interface UserRepository: CrudRepository<User, Long> {

    fun findUserByUsername(username: String): User?

}
0 голосов
/ 09 марта 2019

Вы можете попробовать эту маленькую реактивную оболочку JPA, которая на самом деле не реактивна, но выполняет вызовы JDBC на изолированном ThreadPool.

https://github.com/IBM/reactive-components

0 голосов
/ 12 апреля 2019

Несмотря на то, что выбранная вами база данных (H2) не поддерживает неблокирующие реактивные запросы, вы все равно можете получать данные блокирующим образом, а затем как можно скорее преобразовывать их в реактивный тип для удобства вышестоящих компонентов.

Вы не можете ничего сделать с блокирующим характером вызова метода в репозитории JPA.Однако вы можете преобразовать нереактивный тип в реактивный тип (Flux / Mono), как только вы его получите, чтобы с этого момента вы могли реагировать на результаты.

ИлиВы можете использовать другие базы данных, поддерживающие реактивную модель, такие как Cassandra, MongoDB, Couchbase или Redis.

0 голосов
/ 24 сентября 2018

Если вам нужны все преимущества реактивного, асинхронного / неблокирующего, вам нужно сделать весь стек асинхронным / неблокирующим.JDBC действительно является блокирующим API, поэтому вы не можете создать полностью реактивное / неблокирующее приложение, если вам нужен доступ к базе данных через JDBC.

Но вам все еще нужна реляционная база данных, тогда вы порекомендуете использовать rxjava2-jdbc, и вот полный пример использования RxJava и RxJava jdbc spring-webflux-async-jdbc-sample

Кажется, в настоящее время Spring Webflux поддерживает Mongodb, Redis и т. Д. Nosql реагирует, поэтому вместо JPA используйте spring-boot-starter-data-mongodb-reactive.

...