Cómo usar los datos de Spring con couchbase sin el atributo _class

¿Existe una forma sencilla de utilizar la base de datos de Spring Spring con documentos que no tienen el atributo _class ? En la base de sofá tengo algo como esto en mi cubo de sampledata :

 { "username" : "alice", "created" : 1473292800000, "data" : { "a": 1, "b" : "2"}, "type" : "mydata" } 

Ahora, ¿hay alguna forma de definir la asignación de esta estructura de documento a un objeto Java (tenga en cuenta que _class atributo _class y no se puede agregar) y viceversa para obtener todas (o la mayoría) de las características automáticas de los datos de Spring couchbase?

Algo como: si el campo type tiene el valor “mydata”, use la clase MyData.java. Entonces, cuando se realiza la búsqueda, en lugar de agregar automáticamente AND _class = "mydata" a la consulta generada, agregue AND type = "mydata" .

Spring Data en general necesita el campo _class para saber qué instanciar cuando deserializa.

Es bastante fácil en Spring Data Couchbase usar un nombre de campo diferente al de _class , al reemplazar el método typeKey() en AbsctractCouchbaseDataConfiguration .

Pero todavía esperará un nombre de clase completamente calificado allí por defecto

Moverse por ahí requerirá un poco más de trabajo:

  1. Tendrá que implementar su propio CouchbaseTypeMapper , siguiendo el modelo de DefaultCouchbaseTypeMapper . En el constructor super(...) , deberá proporcionar un argumento adicional: una lista de TypeInformationMapper . La implementación predeterminada no proporciona explícitamente una, por SimpleTypeInformationMapper se utiliza un SimpleTypeInformationMapper , que es el que pone los FQN.
  2. Hay una implementación alternativa que se puede configurar para que pueda crear alias de clases a un nombre más corto a través de Map : ConfigurableTypeInformationMapper … 3.Así, agregue un ConfigurableTypeInformationMapper con el alias que desee para clases específicas + un SimpleTypeInformationMapper después de la lista (para En el caso de que haya serializado una clase para la que no proporcionó un alias, puede lograr su objective.
  3. El typeMapper se usa dentro del MappingCouchbaseConverter , que también necesitará extender desafortunadamente (solo para crear una instancia de su typeMapper lugar del predeterminado).
  4. Una vez que tenga eso, vuelva a anular la configuración para devolver una instancia de su MappingCouchbaseConverter personalizado que usa su CouchbaseTypeMapper personalizado (el método mappingCouchbaseConverter() ).

En su clase de configuración couchbase solo necesita tener:

 @Override public String typeKey() { return "type"; } 

Desafortunadamente, para la derivación de consulta (n1ql), la clase o el tipo todavía están usando el nombre de la clase. Probé Spring 2.2.6 y es el punto negativo aquí. @Simon, ¿sabe que algo ha cambiado y que el soporte tiene la posibilidad de tener un valor de clase / tipo personalizado en las próximas versiones?

    Intereting Posts