0

Ich bin neu in der riesigen Welt des Backend, also einfach nur mit mir. Ich habe ein paar Probleme mit der Verwandlung meines Gegenstandes in einen "Student" mit Jackson ObjectMapper. Ich habe die Methode bekommen, das richtige Item basierend auf dem ID-Parameter von vorne zu bekommen. Also das ist die Methode, die funktioniert, aber nichts zurückgibt, weil ich nur testen wollte, ob es funktioniert.Abrufen eines Elements aus DynamoDB basierend auf ID und Umwandeln des Elements

AwsService:

public void getStudent(String id){ 

    Table t = db.getTable(studentTableName); 

    GetItemSpec gio = new GetItemSpec() 
      .withPrimaryKey("id", id); 

    Item item = t.getItem(gio); 
    System.out.println("Student: "+item); // <--- Gives the correct item! 

} 

Aber jetzt brauche ich es einen "Student" zurückzukehren, so statt Leere, sollte es einen Student zurück:

public Student getStudent(String id){ 

    Table t = db.getTable(studentTableName); 

    GetItemSpec gio = new GetItemSpec() 
      .withPrimaryKey("id", id); 

    Item item = t.getItem(gio); 

    //Problem starts here, unsure of how to do. As is, getS() is underlined as error 
    Student student = mapper.readValue(item.get("payload").getS(), Student.class); 

    return student; 
} 

nur als Referenz Ich werde füge meine Arbeitsmethode zum Abrufen aller Schüler hinzu. So wie Sie sehen können, habe ich versucht, das gleiche mapper.readValue wie in dem Verfahren für die Beschaffung von allen Studenten zu verwenden.

public List<Student> getStudents() { 

    final List<Student> students = new ArrayList<Student>(); 

    ScanRequest scanRequest = new ScanRequest() 
      .withTableName(studentTableName); 

    ScanResult result = client.scan(scanRequest); 
    try { 
     for (Map<String, AttributeValue> item : result.getItems()) { 
      Student student = mapper.readValue(item.get("payload").getS(), Student.class); 
      students.add(student); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

    return students; 
} 
+0

ersetzen item.get ("payload") gets() mit "item.getJSON (" payload ") und versuchen, wie es geht. Substring (1).". Hoffe alle Attribute Namen in Dynamodb und Student-Klasse entspricht! Andernfalls können Sie einen anderen Fehler erhalten. – notionquest

+0

Okay, das hilft! Es druckt die richtigen Daten in der Konsole, aber mit '\' dazwischen. Fehlercode 92 wie folgt: [link] (http://yuluer.com/page/dggeggjd-unexpected-character-code-92-in-jackson.shtml) Ich habe versucht, escapeJson für meine "Schüler", gibt aber unterstrichen Fehler bei die EscapeJson. Irgendwelche Ideen? – Alex

+0

Ich würde mir keine Gedanken über das Escape-Zeichen in der Konsolenausgabe machen, da es eine Standardmethode zum Drucken der JSON-Zeichenfolge ist. Das Hauptziel besteht darin, das Student-Objekt mit allen aufgefüllten Werten zurückzugeben. Als Alternative können Sie das Student-Objekt object.toString() drucken, das die Daten ohne Escapezeichen ausgibt. Bitte akzeptieren Sie die Antwort, wenn es Ihr ursprüngliches Problem gelöst hat. – notionquest

Antwort

1

ersetzen item.get ("payload") gets() mit „item.getJSON ("Nutzlast"). Teilzeichenfolge (1) ".

+0

Das Backslashed war das Problem, wie ich vermutete. Unter meiner eigenen Antwort. Ich musste die Unescapes Json in meiner Methode verschachteln. – Alex

0

Ich fand es heraus. Hier ist die richtige Methode für mich:

public Student getStudent(String id) throws JsonParseException, JsonMappingException, IOException { 

    Table t = db.getTable(studentTableName); 

    GetItemSpec gio = new GetItemSpec() 
      .withPrimaryKey("id", id); 

    Item item = t.getItem(gio); 

    Student student = mapper.readValue(StringEscapeUtils.unescapeJson(item.getJSON("payload").substring(1)), Student.class); 

    return student; 

} 
Verwandte Themen