DynamoDBMAPPER无法正常工作-Save批处理记录抛出@dynamodbtyped或@dynamodbtybt



我想做什么? - 我想使用DynamoDBMapper将批次记录保存到DynamoDB中。

模型类

package model;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = "jobTable")
public final class MapperModel {
    public String jobId;
    public String jobName;
    public Stringparams stringparams[];
    public String url;
    public String source;
    public String[] target;
    public String contentType;
    public String dueDate;
    public Metadata metadata;
    /** getters start here **/
    @DynamoDBHashKey(attributeName = "jobId")
    public String getJobId() {
        return jobId;
    }
    @DynamoDBAttribute(attributeName = "jobName")
    public String getJobName() {
        return jobName;
    }
    @DynamoDBAttribute(attributeName = "url")
    public String getURL() {
        return url;
    }
    @DynamoDBAttribute(attributeName = "strings")
    public Stringparams[] getStrings() {
        return stringparams;
    }

    @DynamoDBAttribute(attributeName = "source")
    public String getSource() {
        return source;
    }
    @DynamoDBAttribute(attributeName = "target")
    public String[] getTarget() {
        return target;
    }
    @DynamoDBAttribute(attributeName = "contentType")
    public String getContentType() {
        return contentType;
    }
    @DynamoDBAttribute(attributeName = "dueDate")
    public String getDueDate() {
        return dueDate;
    }
    @DynamoDBAttribute(attributeName = "metadata")
    public Metadata getMetadata() {
        return metadata;
    }
    /** setters start here **/
    public void setJobId(String string) {
        this.jobId = string;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    public void setStrings(Stringparams[] strings) {
        this.stringparams = strings;
    }
    public void setURL(String url) {
        this.url = url;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public void setTarget(String[] target) {
        this.target = target;
    }
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    public void setDueDate(String dueDate) {
        this.dueDate = dueDate;
    }
    public void setMetadata(Metadata metadata) {
        this.metadata = metadata;
    }
    @DynamoDBDocument
    public static final class Stringparams {
        @DynamoDBAutoGeneratedKey
        public String key;
        public String value;
        public String description;
        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        @DynamoDBAttribute(attributeName = "value")
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        @DynamoDBAttribute(attributeName = "description")
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
    }
    @DynamoDBDocument
    public static final class Metadata {
        public String invoicingCategory;
        public String invoicingRegion;
        public String referenceURL;
        public void setInvoicingCategory(String invoicingCategory) {
            this.invoicingCategory = invoicingCategory;
        }
        public void setInvoicingRegion(String invoicingRegion) {
            this.invoicingRegion = invoicingRegion;
        }
        public void setReferenceURL(String referenceURL) {
            this.referenceURL = referenceURL;
        }
        @DynamoDBAttribute(attributeName = "invoicingCategory")
        public String getInvoicingCategory() {
            return invoicingCategory;
        }
        @DynamoDBAttribute(attributeName = "invoicingRegion")
        public String getInvoicingRegion() {
            return invoicingRegion;
        }
        @DynamoDBAttribute(attributeName = "referenceURL")
        public String getReferenceURL() {
            return referenceURL;
        }
    }
}
public class Test {
    ......
    .......
    public void persistRecordsToDataStore(List<MapperModel> 
                                          requestModelList) 
    {
                AmazonDynamoDB amazonDynamoDBClient = new 
                                       AmazonDynamoDBClient();
                DynamoDBMapper dynamoDBMapper = new  
                                     DynamoDBMapper(amazonDynamoDBClient);

     amazonDynamoDBClient.setRegion(Region.getRegion(Regions.US_WEST_2));
     boolean insertStatus = insertRecords(dynamoDBMapper, requestModelList)
   }     

   public static boolean insertRecords(DynamoDBMapper dynamoDBMapper,
                    List<MapperModel> requestModelList) 
   {
      for (MapperModel requestModel : requestModelList) 
      {
        dynamoDBMapper.save(requestModel);
      }
       return true;
   }
        ......
        ......
   }

问题:我看到一个错误不支持;需要@dynamodbtyped或@dynamodbtypeconverted 。谁能帮助我理解并分享修复程序?

使用注释@DynamoDBDocument

有更简单的方法

例如,在上述Java类中,

@DynamoDBDocument
public class Metadata {
    private Stirng aa;
    private int bb;
}

那么它应该起作用

我已经弄清了亚马逊文档的答案http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/dynamodbmapper.arbitrarydatamapping.htmapping.htmapping.html

解决我的问题

    @DynamoDBTable(tableName = "jobTable")
    public final class MapperModel {
    public String jobId;
    public String jobName;
    public Stringparams stringparams[];
    public String url;
    public String source;
    public String[] target;
    public String contentType;
    public String dueDate;
    public Metadata metadata;
    @DynamoDBHashKey(attributeName = "jobId")
    public String getJobId() {
        return jobId;
    }
    @DynamoDBAttribute(attributeName = "jobName")
    public String getJobName() {
        return jobName;
    }
    @DynamoDBAttribute(attributeName = "url")
    public String getURL() {
        return url;
    }
    **@DynamoDBTypeConverted(converter= StringparamsTypeConverter.class)**
    public Stringparams[] getStrings() {
        return stringparams;
    }

    @DynamoDBAttribute(attributeName = "source")
    public String getSource() {
        return source;
    }
    @DynamoDBAttribute(attributeName = "target")
    public String[] getTarget() {
        return target;
    }
    @DynamoDBAttribute(attributeName = "contentType")
    public String getContentType() {
        return contentType;
    }
    @DynamoDBAttribute(attributeName = "dueDate")
    public String getDueDate() {
        return dueDate;
    }
    **@DynamoDBTypeConverted(converter = MetadataTypeConverter.class)**
    public Metadata getMetadata() {
        return metadata;
    }
    /** setters start here **/
    public void setJobId(String string) {
        this.jobId = string;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    public void setStrings(Stringparams[] strings) {
        this.stringparams = strings;
    }
    public void setURL(String url) {
        this.url = url;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public void setTarget(String[] target) {
        this.target = target;
    }
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    public void setDueDate(String dueDate) {
        this.dueDate = dueDate;
    }
    public void setMetadata(Metadata metadata) {
        this.metadata = metadata;
    }
}

我只为一个Objecttype转换器提供代码。

public class MetadataTypeConverter implements DynamoDBTypeConverter<String, Metadata> {
    @Override
    public String convert(final Metadata metadata) {
        String metadataValue = null;
        try {
            .....
            .....
            your custom code
        } catch (JsonProcessingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return metadataValue;
    }
    @Override
    public Metadata unconvert(final String jsonData) {
        Metadata metadataType = null;
        try {
            .....
            .....
            your custom code
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return metadataType;
    }
}

您错过了自定义类元数据的DynamoDB转换。您可以编写自己的转换器,或者可以使用@dynamodbtybeconverted属性,然后将自定义类名称指定为参数。

这里有一个示例使用dynamodbtypecodverted:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/dynamodbmapper.arbitrarydatamapping.html

在我的情况下,问题是我没有意识到DynamoDB映射器会自动尝试映射所有公共方法。我花了很长时间才能找到这个问题,因为错误消息没有报告其失败的属性。

可以这样解决:

@DynamoDBIgnore
public SomeNonMappableObject getThing() {
   ...
}

最新更新