具有另一个对象列表的对象的 DynamoDB Mapper 注释
DynamoDB Mapper annotation for Object which has list of another object
我正在尝试为以下情况创建一个 dynamoDBMapper 注释。
我有 EmployeeLevelTrail,它是 class 员工级别记录
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = “EmployeeDataRecord”;
@DynamoDBAttribute(attributeName = “employeeID”)
public String EmployeeID;
@DynamoDBAttribute(attributeName = “EmployeeLevelDataRecords”)
@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.M)
public EmployeeLevelTrail employeeLevelTrail
}
public class EmployeeLevelTrail {
public final static String DDB_ATTR_EMPLOYEE_LEVEL_TRAIL = “employeeLevelTrail”;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_TRAIL)
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
public class EmployeeLevelRecord {
private String Level;
private String Manager;
private Instant timeOfEvent;
}
这是我的注释,但不正确,因为我无法保存我的 DynamoDB 数据
您需要使用 DynamoDBTypeConverted
注释。您还需要创建一个转换器 class,它定义如何从您的 Java 对象获取 DynamoDB 原语(可能是一个字符串)。
您还可以从这个答案中查看示例:
要将另一个 class 标记为 DynamoDBMapper 数据模型的一部分,您可以使用 @DynamoDBDocument
对其进行注释,这会告诉 DynamoDBMapper class 可以序列化为 DynamoDB 文档.
对于您没有编写的 classes(即来自 Java 库或外部库)或者如果您需要更多地控制如何序列化您自己的 classes,您可以使用 @DynamoDBTypeConverted
,它允许您 map arbitrary data by providing your own DynamoDBTypeConverter
实现从任何 Java 对象转换为任何受支持的 DynamoDB 类型。
使用您的示例代码,我添加了适当的 @DynamoDBDocument
和 @DynamoDBTypeConverted
注释,以及将 Instant
转换为 DynamoDBTypeConverter
的示例实现] 到 ISO-8601 String
。如果 employeeId
是您的 table 的散列键,请确保您也将 @DynamoDBHashKey
注释添加到 employeeId
。
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = “EmployeeDataRecord”;
@DynamoDBAttribute(attributeName = “employeeID”)
public String EmployeeID;
@DynamoDBAttribute(attributeName = “EmployeeLevelDataRecords”)
public EmployeeLevelTrail employeeLevelTrail
}
@DynamoDBDocument
public class EmployeeLevelTrail {
public final static String DDB_ATTR_EMPLOYEE_LEVEL_TRAIL = “employeeLevelTrail”;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_TRAIL)
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
@DynamoDBDocument
public class EmployeeLevelRecord {
private String Level;
private String Manager;
@DynamoDBTypeConverted(converter = InstantToStringTypeConverter.class)
private Instant timeOfEvent;
}
public class InstantToStringTypeConverter implements DynamoDBTypeConverter<String, Instant> {
@Override
public String convert(final Instant instant) {
return instant.toString();
}
@Override
public Instant unconvert(final String string) {
return Instant.parse(string);
}
}
我使用以下代码找到了解决方案。仅使用@DynamoDBTypeConvertedJSON,我能够在 table 中创建一个条目,但无法像 运行 那样更新它以映射 Dynamo DB 映射异常。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = "EmployeeData";
public final static String DDB_ATTR_ID = "Id";
public final static String DDB_ATTR_EMPLOYEE_LEVEL_RECORD_TRAIL = "EmployeeLevelRecordTrail";
@DynamoDBHashKey(attributeName = DDB_ATTR_ID)
@DynamoDBAttribute(attributeName = DDB_ATTR_ID)
private String id;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_RECORD_TRAIL)
@DynamoDBTypeConverted(converter = EmployeeLevelRecordTrailConverter.class)
private EmployeeLevelRecordTrail employeeLevelRecordTrail;
@DynamoDBAttribute(attributeName = DDB_ATTR_CREATED_TIME)
@DynamoDBTypeConverted(converter = InstantConverter.class)
private Instant joiningTime;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeLevelRecordTrail {
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@DynamoDBDocument
public class EmployeeLevelRecord {
private String Level;
private String Manager;
@DynamoDBTypeConverted(converter = InstantConverter.class)
private Instant timeOfEvent;
}
public class EmployeeLevelRecordTrailConverter implements
DynamoDBTypeConverter<List<EmployeeLevelRecord>, EmployeeLevelRecordTrail> {
@Override
public List<EmployeeLevelRecord> convert(EmployeeLevelRecordTrail employeeLevelRecordTrail) {
return employeeLevelRecordTrail.getEmployeeLevelRecord();
}
@Override
public EmployeeLevelRecordTrail unconvert(List<EmployeeLevelRecord> thisEmployeeLevelRecords) {
return new EmployeeLevelRecordTrail(thisEmployeeLevelRecords);
}
}
public class InstantConverter implements DynamoDBTypeConverter<String, Instant> {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT;
@Override
public String convert(Instant instant) {
return instant == null ? null : DATE_TIME_FORMATTER.format(instant);
}
@Override
public Instant unconvert(String str) {
return str == null ? null : Instant.from(DATE_TIME_FORMATTER.parse(str));
}
}
阅读有关如何进行映射的文档很有帮助。
我正在尝试为以下情况创建一个 dynamoDBMapper 注释。
我有 EmployeeLevelTrail,它是 class 员工级别记录
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = “EmployeeDataRecord”;
@DynamoDBAttribute(attributeName = “employeeID”)
public String EmployeeID;
@DynamoDBAttribute(attributeName = “EmployeeLevelDataRecords”)
@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.M)
public EmployeeLevelTrail employeeLevelTrail
}
public class EmployeeLevelTrail {
public final static String DDB_ATTR_EMPLOYEE_LEVEL_TRAIL = “employeeLevelTrail”;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_TRAIL)
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
public class EmployeeLevelRecord {
private String Level;
private String Manager;
private Instant timeOfEvent;
}
这是我的注释,但不正确,因为我无法保存我的 DynamoDB 数据
您需要使用 DynamoDBTypeConverted
注释。您还需要创建一个转换器 class,它定义如何从您的 Java 对象获取 DynamoDB 原语(可能是一个字符串)。
您还可以从这个答案中查看示例:
要将另一个 class 标记为 DynamoDBMapper 数据模型的一部分,您可以使用 @DynamoDBDocument
对其进行注释,这会告诉 DynamoDBMapper class 可以序列化为 DynamoDB 文档.
对于您没有编写的 classes(即来自 Java 库或外部库)或者如果您需要更多地控制如何序列化您自己的 classes,您可以使用 @DynamoDBTypeConverted
,它允许您 map arbitrary data by providing your own DynamoDBTypeConverter
实现从任何 Java 对象转换为任何受支持的 DynamoDB 类型。
使用您的示例代码,我添加了适当的 @DynamoDBDocument
和 @DynamoDBTypeConverted
注释,以及将 Instant
转换为 DynamoDBTypeConverter
的示例实现] 到 ISO-8601 String
。如果 employeeId
是您的 table 的散列键,请确保您也将 @DynamoDBHashKey
注释添加到 employeeId
。
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = “EmployeeDataRecord”;
@DynamoDBAttribute(attributeName = “employeeID”)
public String EmployeeID;
@DynamoDBAttribute(attributeName = “EmployeeLevelDataRecords”)
public EmployeeLevelTrail employeeLevelTrail
}
@DynamoDBDocument
public class EmployeeLevelTrail {
public final static String DDB_ATTR_EMPLOYEE_LEVEL_TRAIL = “employeeLevelTrail”;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_TRAIL)
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
@DynamoDBDocument
public class EmployeeLevelRecord {
private String Level;
private String Manager;
@DynamoDBTypeConverted(converter = InstantToStringTypeConverter.class)
private Instant timeOfEvent;
}
public class InstantToStringTypeConverter implements DynamoDBTypeConverter<String, Instant> {
@Override
public String convert(final Instant instant) {
return instant.toString();
}
@Override
public Instant unconvert(final String string) {
return Instant.parse(string);
}
}
我使用以下代码找到了解决方案。仅使用@DynamoDBTypeConvertedJSON,我能够在 table 中创建一个条目,但无法像 运行 那样更新它以映射 Dynamo DB 映射异常。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
public final static String TABLE_NAME = "EmployeeData";
public final static String DDB_ATTR_ID = "Id";
public final static String DDB_ATTR_EMPLOYEE_LEVEL_RECORD_TRAIL = "EmployeeLevelRecordTrail";
@DynamoDBHashKey(attributeName = DDB_ATTR_ID)
@DynamoDBAttribute(attributeName = DDB_ATTR_ID)
private String id;
@DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_RECORD_TRAIL)
@DynamoDBTypeConverted(converter = EmployeeLevelRecordTrailConverter.class)
private EmployeeLevelRecordTrail employeeLevelRecordTrail;
@DynamoDBAttribute(attributeName = DDB_ATTR_CREATED_TIME)
@DynamoDBTypeConverted(converter = InstantConverter.class)
private Instant joiningTime;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeLevelRecordTrail {
private List<EmployeeLevelRecord> thisEmployeeLevelRecords;
public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {
thisEmployeeLevelRecords.add(employeeLevelRecord);
}
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@DynamoDBDocument
public class EmployeeLevelRecord {
private String Level;
private String Manager;
@DynamoDBTypeConverted(converter = InstantConverter.class)
private Instant timeOfEvent;
}
public class EmployeeLevelRecordTrailConverter implements
DynamoDBTypeConverter<List<EmployeeLevelRecord>, EmployeeLevelRecordTrail> {
@Override
public List<EmployeeLevelRecord> convert(EmployeeLevelRecordTrail employeeLevelRecordTrail) {
return employeeLevelRecordTrail.getEmployeeLevelRecord();
}
@Override
public EmployeeLevelRecordTrail unconvert(List<EmployeeLevelRecord> thisEmployeeLevelRecords) {
return new EmployeeLevelRecordTrail(thisEmployeeLevelRecords);
}
}
public class InstantConverter implements DynamoDBTypeConverter<String, Instant> {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT;
@Override
public String convert(Instant instant) {
return instant == null ? null : DATE_TIME_FORMATTER.format(instant);
}
@Override
public Instant unconvert(String str) {
return str == null ? null : Instant.from(DATE_TIME_FORMATTER.parse(str));
}
}
阅读有关如何进行映射的文档很有帮助。