【问题标题】:Retrieving an item from DynamoDB based on id and transforming the item根据 id 从 DynamoDB 中检索项目并转换项目
【发布时间】:2016-06-02 05:49:33
【问题描述】:

我在使用 Jackson ObjectMapper 将我的项目转换为“学生”时遇到了一些麻烦。我已经获得了基于从前面发送的 id 参数实际获取正确项目的方法。所以这是有效的方法,但不返回任何东西,因为我只是想测试它是否有效。

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!

}

但现在我需要它返回一个“学生”,所以它应该返回一个学生而不是 void:

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;
}

作为参考,我将添加检索所有学生的工作方法。如您所见,我尝试使用与检索所有学生的方法相同的 mapper.readValue:

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;
}

【问题讨论】:

  • 将 item.get("payload").getS() 替换为 "item.getJSON("payload").substring(1)" 并尝试它是如何进行的。希望 Dynamodb 和 Student 类中的所有属性名称都匹配!否则,您可能会遇到其他错误。
  • 好的,这有帮助!它在控制台中打印正确的数据,但中间有“\”。像这样的错误代码 92:link 我尝试为我的“学生”使用 escapeJson,但在 escapeJson 处给出了带下划线的错误。有什么想法吗?
  • 我不会担心控制台输出中的转义字符,因为它是打印 JSON 字符串的标准方式。主要目的是返回填充了所有值的 Student 对象。作为替代方案,您可以打印 Student object.toString() ,它将打印不带转义字符的数据。如果它解决了您最初的问题,请接受答案。
  • 如果我知道答案是正确的,我当然会接受。我只是假设它没有解决我的问题,因为数据没有传递到前面。发送整个列表时,它会通过前面,如果我在后端的控制台中打印整个列表,它没有转义字符......所以我认为这是这个解决方案的问题......
  • 还是前端收不到学生数据?如果是,您是否尝试在方法结束时打印学生对象以检查它是否具有预期的数据?当我们在这里讨论后端方法时,我完全专注于 getStudent(String id)。中间可能有很多我不知道的事情可能出错。只要在方法结束时正确打印了学生对象数据,那么原来的问题就解决了。

标签: java amazon-web-services jackson amazon-dynamodb objectmapper


【解决方案1】:

将 item.get("payload").getS() 替换为 "item.getJSON("payload").substring(1)"。

【讨论】:

  • 反斜杠是我怀疑的问题。下面是我自己的答案。我不得不在我的方法中嵌套 unescape json。
【解决方案2】:

我想通了。这是对我来说正确的方法:

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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多