es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuándo se corregirá el mapeo abstracto en Couchbase Reactive en la primavera?

¿Existe alguna solución para utilizar un super tipo (clase abstracta) en Spring Boot Starter Data Couchbase Reactivo?
Mi idea es tener un super tipo y guardar este super tipo en el bucket de Couchbase, y leerlo. La escritura funciona perfectamente, pero al leer, obtengo una excepción:

org.springframework.beans.BeanInstantiationException: Fallo al instanciar [com.entities.Report]: la clase es abstracta

Las clases están implementadas de la siguiente manera:

Report:

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = “documentType”
)
@JsonSubTypes(
JsonSubTypes.Type(value = TestReport::class, name = TestReport.DOCUMENT_TYPE),
JsonSubTypes.Type(value = Test2Report::class, name = Test2Report.DOCUMENT_TYPE)
)

@Document
abstract class Report: SyncDocument {

var inspectorId: String = “”
var reportNumber: String = “”
var reportDate: Long = 0

constructor(): super(null) {}

}

TestReport:

@Document
@TypeAlias(TestReport.DOCUMENT_TYPE)
class TestReport: Report {

companion object {
const val DOCUMENT_TYPE: String = “TestReport”
}

var string3: String = “”

constructor(): super() {}

}

Test2Report:

@Document
@TypeAlias(Test2Report.DOCUMENT_TYPE)
class Test2Report: Report {

companion object {
const val DOCUMENT_TYPE: String = “Test2Report”
}

var string2: String = “”

constructor(): super() {}

}

He implementado este código de esta manera en otro proyecto de Android donde no se utiliza ReactiveCrudRepository, y funciona perfectamente. Ahora quiero usar el mismo esquema en ReactiveCrudRepository.

¡Gracias por cualquier sugerencia!

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, es posible utilizar un tipo padre (clase abstracta) en Spring Boot Starter Data Couchbase Reactive. Una solución es utilizar las anotaciones @JsonTypeInfo y @JsonSubTypes para especificar los subtipos de la clase abstracta.

    En el código de ejemplo, la clase Report está anotada con @Document y @JsonTypeInfo. La anotación @JsonTypeInfo especifica el tipo de la propiedad que se utiliza para determinar el subtipo al deserializar JSON. La anotación @JsonSubTypes especifica los subtipos disponibles de la clase abstracta.

    Para leer desde el bucket de Couchbase, se puede utilizar la interfaz ReactiveCrudRepository proporcionada por Spring Boot Starter Data Couchbase Reactive. Asegúrese de que las subclases concretas (TestReport y Test2Report) también estén anotadas con @Document y @TypeAlias para habilitar el mapeo de JSON a objetos Java.

    Si se encuentra con la excepción “org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.entities.Report]: Class is abstract” al leer del bucket de Couchbase, asegúrese de que se estén utilizando las subclases concretas al leer los documentos del bucket. Puede utilizar el método type() en la interfaz QueryByExampleExecutor para especificar el tipo del documento a leer.

    En general, el uso de clases abstractas y subtipos en Spring Boot Starter Data Couchbase Reactive puede ser una forma poderosa de mapear estructuras de datos complejas a documentos JSON en una base de datos NoSQL.

Comments are closed.