Pertahankan benda kosong dengan @DynamoDbPreserveEmptyObject - AWS SDK for Java 2.x

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pertahankan benda kosong dengan @DynamoDbPreserveEmptyObject

Jika Anda menyimpan kacang ke Amazon DynamoDB dengan objek kosong dan Anda ingin SDK membuat ulang objek kosong saat pengambilan, beri anotasi pengambil kacang bagian dalam dengan. @DynamoDbPreserveEmptyObject

Untuk mengilustrasikan cara kerja anotasi, contoh kode menggunakan dua kacang berikut.

Kelas data berikut berisi dua InnerBean bidang. Metode getter,getInnerBeanWithoutAnno(), tidak dijelaskan dengan. @DynamoDbPreserveEmptyObject getInnerBeanWithAnno()Metode ini dijelaskan.

@DynamoDbBean public class MyBean { private String id; private String name; private InnerBean innerBeanWithoutAnno; private InnerBean innerBeanWithAnno; @DynamoDbPartitionKey public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public InnerBean getInnerBeanWithoutAnno() { return innerBeanWithoutAnno; } public void setInnerBeanWithoutAnno(InnerBean innerBeanWithoutAnno) { this.innerBeanWithoutAnno = innerBeanWithoutAnno; } @DynamoDbPreserveEmptyObject public InnerBean getInnerBeanWithAnno() { return innerBeanWithAnno; } public void setInnerBeanWithAnno(InnerBean innerBeanWithAnno) { this.innerBeanWithAnno = innerBeanWithAnno; } @Override public String toString() { return new StringJoiner(", ", MyBean.class.getSimpleName() + "[", "]") .add("innerBeanWithoutAnno=" + innerBeanWithoutAnno) .add("innerBeanWithAnno=" + innerBeanWithAnno) .add("id='" + id + "'") .add("name='" + name + "'") .toString(); } }

Contoh dari InnerBean kelas berikut adalah bidang MyBean dan diinisialisasi sebagai objek kosong dalam kode contoh.

@DynamoDbBean public class InnerBean { private String innerBeanField; public String getInnerBeanField() { return innerBeanField; } public void setInnerBeanField(String innerBeanField) { this.innerBeanField = innerBeanField; } @Override public String toString() { return "InnerBean{" + "innerBeanField='" + innerBeanField + '\'' + '}'; } }

Contoh kode berikut menyimpan MyBean objek dengan kacang dalam yang diinisialisasi ke DynamoDB dan kemudian mengambil item tersebut. Output yang dicatat menunjukkan bahwa tidak innerBeanWithoutAnno diinisialisasi, tetapi innerBeanWithAnno telah dibuat.

public MyBean preserveEmptyObjectAnnoUsingGetItemExample(DynamoDbTable<MyBean> myBeanTable) { // Save an item to DynamoDB. MyBean bean = new MyBean(); bean.setId("1"); bean.setInnerBeanWithoutAnno(new InnerBean()); // Instantiate the inner bean. bean.setInnerBeanWithAnno(new InnerBean()); // Instantiate the inner bean. myBeanTable.putItem(bean); GetItemEnhancedRequest request = GetItemEnhancedRequest.builder() .key(Key.builder().partitionValue("1").build()) .build(); MyBean myBean = myBeanTable.getItem(request); logger.info(myBean.toString()); // Output 'MyBean[innerBeanWithoutAnno=null, innerBeanWithAnno=InnerBean{innerBeanField='null'}, id='1', name='null']'. return myBean; }

Anda dapat menggunakan StaticTableSchema versi skema tabel berikut sebagai pengganti anotasi pada kacang.

public static TableSchema<MyBean> buildStaticSchemas() { StaticTableSchema<InnerBean> innerBeanStaticTableSchema = StaticTableSchema.builder(InnerBean.class) .newItemSupplier(InnerBean::new) .addAttribute(String.class, a -> a.name("innerBeanField") .getter(InnerBean::getInnerBeanField) .setter(InnerBean::setInnerBeanField)) .build(); return StaticTableSchema.builder(MyBean.class) .newItemSupplier(MyBean::new) .addAttribute(String.class, a -> a.name("id") .getter(MyBean::getId) .setter(MyBean::setId) .addTag(primaryPartitionKey())) .addAttribute(String.class, a -> a.name("name") .getter(MyBean::getName) .setter(MyBean::setName)) .addAttribute(EnhancedType.documentOf(InnerBean.class, innerBeanStaticTableSchema), a -> a.name("innerBean1") .getter(MyBean::getInnerBeanWithoutAnno) .setter(MyBean::setInnerBeanWithoutAnno)) .addAttribute(EnhancedType.documentOf(InnerBean.class, innerBeanStaticTableSchema, b -> b.preserveEmptyObject(true)), a -> a.name("innerBean2") .getter(MyBean::getInnerBeanWithAnno) .setter(MyBean::setInnerBeanWithAnno)) .build(); }