【问题标题】:DynamoDBMapper NOT WOrking -Save Batch Record throws @DynamoDBTyped or @DynamoDBTypeConverted ErrorDynamoDBMapper 不工作 - 保存批处理记录会引发 @DynamoDBTyped 或 @DynamoDBTypeConverted 错误
【发布时间】:2016-12-12 19:48:13
【问题描述】:

我想做什么? -我想使用 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。任何人都可以帮助我理解和分享修复吗?

【问题讨论】:

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


    【解决方案1】:

    使用注解@DynamoDBDocument有更简单的方法

    比如上面的java类,

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

    那么它应该可以工作

    【讨论】:

      【解决方案2】:

      我已经从亚马逊文档http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.ArbitraryDataMapping.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;
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        您缺少自定义类元数据的 DynamoDB 转换。 您可以编写自己的转换器,也可以使用 @DynamoDBTypeConverted 属性并将自定义类名指定为参数。

        【讨论】:

          【解决方案4】:

          【讨论】:

          • 欢迎来到 SO!如果您引用其他网站的解决方案,请至少提供一个最小示例,而不仅仅是一个链接。链接可能会随着时间而改变,因此您的答案将变得毫无价值。
          【解决方案5】:

          就我而言,问题在于我没有意识到 DynamoDB 映射器会自动尝试映射所有公共方法。我花了很长时间才发现这一点,因为错误消息没有报告它失败的属性。

          可以这样解决:

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

          【讨论】:

          • 另一种选择是使用 IntelliJ IDEA 及其调试器。它将反编译 jars 并更容易找到这样的问题。
          猜你喜欢
          • 1970-01-01
          • 2018-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-13
          • 2021-05-14
          • 2016-06-28
          • 1970-01-01
          相关资源
          最近更新 更多