Saltar al contenido

Spring Webflux + JPA: los repositorios reactivos no son compatibles con JPA

Deseamos brindarte la mejor respuesta que descubrimos online. Queremos que te sea útil y si puedes comentarnos alguna mejora hazlo con total libertad.

Solución:

Si desea todos los beneficios de reactivo, asíncrono/sin bloqueo, deberá hacer que toda la pila sea asíncrona/sin bloqueo. De hecho, JDBC es inherentemente una API de bloqueo, por lo que no puede crear una aplicación totalmente reactiva/sin bloqueo si necesita acceder a la base de datos a través de JDBC.

Pero aún necesita una base de datos relacional, entonces recomendará usar rxjava2-jdbc y aquí hay un ejemplo completo del uso de RxJava y RxJava jdbc spring-webflux-async-jdbc-sample

Parece que actualmente Spring webflux es compatible con Mongodb, Redis, etc. nosql reactivo, por lo que en lugar de usar JPA spring-boot-starter-data-mongodb-reactive .

No sé sobre el soporte anterior, pero a partir del 9 de junio de 2019, ¡puede usar WebFlux con repositorios JPA!

Su pila no tiene que ser completamente reactiva. Me gusta WebFlux, pero necesito una base de datos relacional.

Yo tengo:

  • spring-boot-starter-datos-redis-reactivo
  • spring-boot-arrancador-webflux
  • spring-boot-starter-datos-jpa

editar: (FYI) el código está en Kotlin, pero aún debería funcionar en Java.

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

src/core/modelos/Usuario

@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
    


tengo lo mismo JPA: Reactive Repositories are not supported by JPA. error cuando todavía estaba devolviendo objetos mono de la consulta Spring Data como Mono. Sin embargo, si elimina el Mono envoltorio, debería funcionar bien.

src/core/repositories/UserRepository

@Repository
interface UserRepository: CrudRepository 

    fun findUserByUsername(username: String): User?


¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *