我想做什么? - 我想使用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() {
...
}