2017-08-04 1 views
1

Ich verwende ArangoDB 3.1.23 und den ArangoDB Java-Treiber 4.2.2. Ich benutze Eclipse und Maven. Ich habe Probleme, Dokumente als Java-Klassen zu lesen, wie es here erklärt wird. Ich folgte dem Tutorial und schrieb den folgenden Testcode.Dokumente können nicht als Java-Klassen gelesen werden

Wie Sie sehen, funktioniert das Lesen von Dokumenten als BaseDocument oder VelocyPack, aber das Lesen als Java-Klassen gibt eine Null zurück.

public static void main(String[] args) { 

    class MyObject { 

     private String key; 
     private String name; 
     private int age; 

     public MyObject(String name, int age) { 
      this(); 
      this.name = name; 
      this.age = age; 
     } 

     public MyObject() { 
      super(); 
     } 
    } 

    final String dbName = "testdb"; 
    final String collName = "testCollection"; 

    ArangoDB arangoDB = new ArangoDB.Builder().user("root").password("").build(); 

    // Delete existing database 
    try{ 
     System.out.println("Deleted existing " + dbName + " database: " + arangoDB.db(dbName).drop()); 
    } catch (Exception e) { 
     System.err.println("Error while deleting database " + dbName); 
    } 

    // Test database creation 
    try { 
     arangoDB.createDatabase(dbName); 
     System.out.println("Created database " + dbName); 
    } catch (Exception e) { 
     System.err.println("Did not create database " + dbName); 
    } 

    // Test collection creation 
    try { 
     arangoDB.db(dbName).createCollection(collName); 
     System.out.println("Created collection " + collName); 
    } catch (Exception e) { 
     System.err.println("Did not create collection " + collName); 
    } 

    // Test custom class document insertion 
    String key1 = null; 
    try { 
     MyObject myObject = new MyObject("Homer", 38); 
     key1 = arangoDB.db(dbName).collection(collName).insertDocument(myObject).getKey(); 
     System.out.println("Inserted new document as MyObject. key: " + myObject.key + ", " + key1); 
    } catch (Exception e) { 
     System.err.println("Did not insert new document"); 
    } 

    // Test BaseDocument class document insertion 
    String key2 = null; 
    try { 
     BaseDocument myBaseDocument = new BaseDocument(); 
     myBaseDocument.addAttribute("name", "Paul"); 
     myBaseDocument.addAttribute("age", 23); 
     key2 = arangoDB.db(dbName).collection(collName).insertDocument(myBaseDocument).getKey(); 
     System.out.println("Inserted new document as BaseDocument. key: " + myBaseDocument.getKey() + ", " + key2); 
    } catch (Exception e) { 
     System.err.println("Did not insert new document"); 
    } 

    // Test read as VPackSlice 
    String keyToRead1 = key1; 
    VPackSlice doc1 = arangoDB.db(dbName).collection(collName).getDocument(keyToRead1, VPackSlice.class); 
    if (doc1 != null) 
     System.out.println("Open document " + keyToRead1 + " VPackSlice: " + doc1.get("name").getAsString() + " " + doc1.get("age").getAsInt()); 
    else 
     System.err.println("Could not open the document " + keyToRead1 + " using VPackSlice"); 

    // Test read as BaseDocument 
    String keyToRead2 = key1; 
    BaseDocument doc2 = arangoDB.db(dbName).collection(collName).getDocument(keyToRead2, BaseDocument.class); 
    if (doc2 != null) 
     System.out.println("Open document " + keyToRead2 + " as BaseDocument: " + doc2.getAttribute("name") + " " + doc2.getAttribute("age")); 
    else 
     System.err.println("Could not open the document " + keyToRead2 + " as BaseDocument"); 

    // Test read as MyObject 
    String keyToRead3 = key1; 
    MyObject doc3 = arangoDB.db(dbName).collection(collName).getDocument(keyToRead3, MyObject.class); 
    if (doc3 != null) 
     System.out.println("Open document " + keyToRead3 + " as MyObject: " + doc3.name + " " + doc3.age); 
    else 
     System.err.println("Could not open the document " + keyToRead3 + " as MyObject"); 
} 

Ergebnis:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
Deleted existing testdb database: true 
Created database testdb 
Created collection testCollection 
Inserted new document as MyObject. key: null, 3510088 
Inserted new document as BaseDocument. key: 3510092, 3510092 
Open document 3510088 VPackSlice: Homer 38 
Open document 3510088 as BaseDocument: Homer 38 
Could not open the document 3510088 as MyObject 

Antwort

1

ich in der Lage war Ihr Beispiel zu erhalten, indem der MyObject zu seiner eigenen Datei zu arbeiten. Ich denke, es könnte an dem Inline-Objekt liegen, da ich versucht habe, Annotation und Getter/Setter inline hinzuzufügen, und das hat auch nicht funktioniert. Wie so:

import com.arangodb.entity.DocumentField; 
import com.arangodb.entity.DocumentField.Type; 

public class MyObject { 
    @DocumentField(Type.KEY) 
    private String key; 
    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    private String name; 
    private int age; 

    public MyObject(String name, int age) { 
     this(); 
     this.name = name; 
     this.age = age; 
    } 

    public MyObject() { 
     super(); 
    } 
} 

Und

// Test read as MyObject 
String keyToRead3 = key1; 
MyObject doc3 = arangoDB.db(dbName).collection(collName).getDocument(keyToRead3, MyObject.class); 
if (doc3 != null) 
    System.out.println("Open document " + keyToRead3 + " as MyObject: " + doc3.getName() + " " + doc3.getAge()); 
else 
    System.err.println("Could not open the document " + keyToRead3 + " as MyObject"); 

Welche

Inserted new document as MyObject. key: 7498620, 7498620 
Inserted new document as BaseDocument. key: 7498624, 7498624 
Open document 7498620 VPackSlice: Homer 38 
Open document 7498620 as BaseDocument: Homer 38 
Open document 7498620 as MyObject: Homer 38 
+0

Sie produziert Dank! Diese Lösung funktioniert für mich. Das Verschieben der Klasse in eine separate Datei löste das Problem, dass das Dokument nicht geladen wurde, während das "DocumentField" verwendet wurde (ich habe diesen Teil in der Dokumentation [hier] irgendwie übersehen (https://github.com/arangodb/arangodb-java- Treiber # Serialisierung)) erlaubt, dieses andere Problem von "Null" Schlüsseln zu lösen. – Guiux

Verwandte Themen