amazon-dynamodb - 没有自定义编组器或 @DynamoDBDocument 注释,无法解组到类型 d
问题描述
我正在尝试实现自定义类型转换器,但由于上面的错误消息而未能这样做。使用 - deprecated - marshallers 按预期工作
我想知道是否有办法使用@DynamoDBTypeConverted 实现转换,或者我是否被@DynamoDBMarshalling 困住了。
package com.acme;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
import com.amazonaws.services.dynamodbv2.datamodeling.marshallers.ObjectToMapMarshaller;
import com.amazonaws.services.dynamodbv2.datamodeling.unmarshallers.ObjectUnmarshaller;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import java.util.Objects;
@DynamoDBDocument
public class MyDynamoDBEntity {
@DynamoDBTypeConverted(converter = Id.Converter.class)
//@DynamoDBMarshalling(marshallerClass = Id.Marshaller.class)
protected Id id;
public Id getId() {
return id;
}
public void setId(final Id id) {
this.id = id;
}
public static class Converter implements DynamoDBTypeConverter<AttributeValue, MyDynamoDBEntity> {
private ItemConverter itemConverter = ConversionSchemas.V2.getConverter(new ConversionSchema.Dependencies());
@Override
public AttributeValue convert(final MyDynamoDBEntity object) {
if (object == null) {
return null;
}
return new ObjectToMapMarshaller(itemConverter).marshall(object);
}
@Override
public MyDynamoDBEntity unconvert(AttributeValue value) {
try {
// non empty object
if (value.getM() != null && value.getM().size() > 0) {
final ObjectUnmarshaller unmarshaller = new ObjectUnmarshaller(itemConverter, MyDynamoDBEntity.class);
return (MyDynamoDBEntity) unmarshaller.unmarshall(value);
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static class Id {
private String value;
public Id(final String value) {
this.value = value;
}
public String toValue() {
return value;
}
public static Id of(String s) {
return new Id(s);
}
public static class Converter implements DynamoDBTypeConverter<String, Id> {
@Override
public String convert(final Id value) {
return value.toValue();
}
@Override
public Id unconvert(final String value) {
return Id.of(value);
}
}
public static class Marshaller implements DynamoDBMarshaller<Id> {
@Override
public String marshall(final Id value) {
return value.toValue();
}
@Override
public Id unmarshall(final Class<Id> clazz, final String value) {
return Id.of(value);
}
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final Id id = (Id) o;
return Objects.equals(value, id.value);
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
}
感谢您为我指明正确的方向。
解决方案
推荐阅读
- python - Python:ValueError:Expecting,分隔符:加载json时的第1行
- html - 为什么变换:倾斜(30度);与变换不同:matrix(1,0,30,1,0,0);?
- typescript - TypeScript 定义,如何通过匹配参数中的某个值来对函数的参数进行不同的约束
- javascript - 只有一部分数据来自 https.request
- java - 如何告诉 MapperModel 的 map 函数,特定的字段应该具有特定的值?
- centos7 - OpenStack Train 找不到合适的 TLS CA 证书包
- reactjs - Firebase auth 和 React Hook - 从钩子返回的函数不起作用
- parsing - org.python.antlr.ParseException: org.python.antlr.ParseException: Unicode 字符串中的编码声明
- c# - 诺迪奥混音器
- javascript - 如何在 Jquery 或 Cypress 中选择并显示具有相同类的所有项目和元素?