2016-08-09 34 views
1

Gibt es eine einfache Möglichkeit, Federdaten couchbase mit Dokumenten zu verwenden, die kein Attribut _class haben? In der Couchbase Ich habe so etwas in meinem sampledata Eimer:So verwenden Sie Federdaten mit couchbase ohne Attribut _class

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

, jetzt ist es eine Möglichkeit, Mapping von dieser Struktur des Dokuments zu Java-Objekt zu definieren (beachten Sie, dass _class Attribut fehlt und kann nicht hinzugefügt werden) und umgekehrt, damit ich alle (oder die meisten) automatischen Eigenschaften von den Frühlings-couchbase Daten bekomme?

Etwas wie: Wenn type Feld hat Wert "mydata" verwenden Klasse MyData.java. Also, wenn Suche statt AND _class = "mydata" zur generierten Abfrage automatisch hinzufügen hinzugefügt AND type = "mydata".

Antwort

3

Spring Daten im Allgemeinen benötigt die _class Feld zu wissen, was instanziieren zurück beim Deserialisieren.

Es ist ziemlich einfach in Spring Data Couchbase, einen anderen Feldnamen als _class zu verwenden, indem Sie die typeKey() Methode in AbsctractCouchbaseDataConfiguration überschreiben.

Aber es wird noch einen voll qualifizierten Klassennamen dort erwarten standardmäßig

um das Erste wird ganz ein bisschen mehr Arbeit erfordern:

  1. Sie müssen Ihre eigenen implementieren CouchbaseTypeMapper , nach dem Modell DefaultCouchbaseTypeMapper. Im Konstruktor super(...) müssen Sie ein zusätzliches Argument angeben: eine Liste von TypeInformationMapper. Die Standardimplementierung stellt keinen explizit zur Verfügung, so dass ein SimpleTypeInformationMapper verwendet wird, der die FQNs setzt.
  2. Es gibt eine alternative Implementierung, die konfigurierbar ist, so dass Sie bestimmte Klassen auf einen kürzeren Namen über ein Map Alias ​​können: ConfigurableTypeInformationMapper ... Sie wollen für bestimmte Klassen + a SimpleTypeInformationMapper nachdem es 3.So durch ein ConfigurableTypeInformationMapper mit dem Alias ​​setzt in die Liste (für den Fall, dass Sie eine Klasse serialisieren, für die Sie keinen Alias ​​angegeben haben), können Sie Ihr Ziel erreichen.
  3. Die typeMapper im MappingCouchbaseConverter verwendet wird, die Sie auch leider zu verlängern brauchen werden (nur Ihre typeMapper anstelle des Standard-instanziiert.
  4. Sobald Sie, dass wieder die Konfiguration außer Kraft setzen eine Instanz des benutzerdefinierten zurückzukehren . MappingCouchbaseConverter die Ihre benutzerdefinierte verwendet CouchbaseTypeMapper (die mappingCouchbaseConverter() Methode)
+0

Simon, Wenn Sie sagten, dass das FQN standardmäßig erwartet wird. Bedeutet es, dass es überschrieben werden kann? Ich frage das, weil ich versucht habe, was Sie empfohlen haben, es funktionierte, während es in der Datenbank blieb, aber während des Abrufens (zB findByField (...)) verwendet der typeKey-Filter den FQN der Zielklasse, dh Ignorieren der benutzerdefinierte Konverter. – Zava

+1

Können Sie bestätigen, dass es nicht möglich ist, einen Alias ​​anstelle des vollständig qualifizierten Klassennamens zu verwenden, wenn Sie die Abfragemethoden von Spring verwenden? Ich zeichne diese Schlussfolgerung N1qlUtils # createWhereFilterForEntity – Happy

+2

Richtig, AFAIK im Moment ist dies nicht möglich, oder zumindest nicht offiziell unterstützt –

0

In Ihrem Couchbase Konfigurationsklasse müssen Sie nur haben:

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

Leider für Abfrageableitung (n1ql) die _class oder type verwenden immer noch den Klassennamen.Tried Frühling Couch 2.2.6 und es ist Minuspunkt hier. @Simon, ist dir bewusst, dass sich etwas geändert hat und die Unterstützung, um die Möglichkeit zu haben, benutzerdefinierte _class/type Wert in nächsten Releases zu haben?