Amazon dynamodb DynamoDB:DynamoDB映射器为布尔值返回null

Amazon dynamodb DynamoDB:DynamoDB映射器为布尔值返回null,amazon-dynamodb,Amazon Dynamodb,我在DynamoDB中映射了一个布尔值,如下所示- @DynamoDBAttribute(attributeName = "isFlagged") public Boolean getFlagged() { return isFlagged; } 当我使用dynamoDB映射器查询表时,总是得到一个空值。所以我查阅了一些文档并添加了注释- @DynamoDBConvertedBool(DynamoDBConvertedBool.Format.true_fal

我在DynamoDB中映射了一个布尔值,如下所示-

@DynamoDBAttribute(attributeName = "isFlagged")
    public Boolean getFlagged() {
        return isFlagged;
    }
当我使用dynamoDB映射器查询表时,总是得到一个空值。所以我查阅了一些文档并添加了注释-

  @DynamoDBConvertedBool(DynamoDBConvertedBool.Format.true_false)
  @DynamoDBAttribute(attributeName = "isFlagged")
    public Boolean getFlagged() {
        return isFlagged;
    }
我收到“无法取消插入属性”错误。我怎样才能解决这个问题


PS-我是DynamoDB初学者,感谢您的帮助。

似乎DynamoDB中存储的数据格式有问题

首先,这是DynamoDB所期望的:

布尔值

布尔类型属性可以存储true或false

表中的检查数据实际上与此匹配。您是否有不具有“isFlagged”属性的项目?有些是空的吗

如果需要将空值/空值转换为布尔值,则需要实现自定义转换器,该转换器具有极其简单的接口:

// Converts between String (DynamoDB side) and Boolean (application side)
public class MyBooleanConverter implements DynamoDBTypeConverter<String, Boolean> {

    // Add any checks/conversions you see fit:
    @Override
    // Convert to DynamoDB attribute
    public String convert(Boolean object) {
        return object.toString();
    }

    @Override
    // Convert from DynamoDB attribute
    public Boolean unconvert(String object) {
        // Parse as you see necessary here
        return Boolean.parse(object);
    }
}
p.S.

如果方法名称与属性名称匹配,则无需指定属性名称:

  @DynamoDBConvertedBool(converter = MyBooleanConverter.class)
  public Boolean isFlagged() {
     ...
  }

应该足够了。另外,boolean getter应该具有isX格式。

似乎DynamoDB中存储的数据格式存在问题

首先,这是DynamoDB所期望的:

布尔值

布尔类型属性可以存储true或false

表中的检查数据实际上与此匹配。您是否有不具有“isFlagged”属性的项目?有些是空的吗

如果需要将空值/空值转换为布尔值,则需要实现自定义转换器,该转换器具有极其简单的接口:

// Converts between String (DynamoDB side) and Boolean (application side)
public class MyBooleanConverter implements DynamoDBTypeConverter<String, Boolean> {

    // Add any checks/conversions you see fit:
    @Override
    // Convert to DynamoDB attribute
    public String convert(Boolean object) {
        return object.toString();
    }

    @Override
    // Convert from DynamoDB attribute
    public Boolean unconvert(String object) {
        // Parse as you see necessary here
        return Boolean.parse(object);
    }
}
p.S.

如果方法名称与属性名称匹配,则无需指定属性名称:

  @DynamoDBConvertedBool(converter = MyBooleanConverter.class)
  public Boolean isFlagged() {
     ...
  }
应该足够了。另外,布尔getter无论如何都应该具有isX格式。

注释是: @DynamoDBTypeConverted(converter=MyBooleanConverter.class)

返回布尔值.valueOf(对象)

其余的对我有用。

注释是: @DynamoDBTypeConverted(converter=MyBooleanConverter.class)

返回布尔值.valueOf(对象)


Rest为我工作。

您需要添加注释
@DynamoDBTyped

@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.BOOL)
@DynamoDBAttribute(attributeName = "isFlagged")
private boolean isFlagged;

您需要添加注释
@DynamoDBTyped

@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.BOOL)
@DynamoDBAttribute(attributeName = "isFlagged")
private boolean isFlagged;

实际上,我在表中只有2条记录,它们都有值。因此,如果所有记录都有有效值,那么应该没有问题?只要您存储的数据能够被转换器正确解析就可以了。确保您的转换器存储它可以解析的数据,并且其他有权访问该表的应用程序以相同的格式生成数据。如果我的数据库属性为布尔值,并且java对象属性也为布尔值,则我不需要自定义转换器,对吗?还是我仍然需要一个自定义转换器?将getter名称更改为isX对我来说很有用。不知道为什么?事实上,我在表中只有2条记录,它们都有值。因此,如果所有记录都有有效值,那么应该没有问题?只要您存储的数据能够被转换器正确解析就可以了。确保您的转换器存储它可以解析的数据,并且其他有权访问该表的应用程序以相同的格式生成数据。如果我的数据库属性为布尔值,并且java对象属性也为布尔值,则我不需要自定义转换器,对吗?还是我仍然需要一个自定义转换器?将getter名称更改为isX对我来说很有用。想知道为什么吗?