Conserva los objetos vacíos con @DynamoDbPreserveEmptyObject - AWS SDK for Java 2.x

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conserva los objetos vacíos con @DynamoDbPreserveEmptyObject

Si guarda un bean en Amazon DynamoDB con objetos vacíos y desea que el SDK vuelva a crear los objetos vacíos al recuperarlos, anote el getter del bean interior con @DynamoDbPreserveEmptyObject.

Para ilustrar cómo funciona la anotación, en el ejemplo de código se utilizan los dos beans siguientes.

La clase de datos siguiente contiene dos campos InnerBean. El método de getter, getInnerBeanWithoutAnno(), no está anotado con @DynamoDbPreserveEmptyObject. El método getInnerBeanWithAnno() está anotado.

@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(); } }

Las instancias de la clase siguiente InnerBean son campos de MyBean y se inicializan como objetos vacíos en el código de ejemplo.

@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 + '\'' + '}'; } }

El siguiente ejemplo de código guarda un objeto MyBean con objetos beans internos inicializados en DynamoDB y, a continuación, recupera el elemento. El resultado registrado muestra que el innerBeanWithoutAnno no se ha inicializado, sino que se ha creado innerBeanWithAnno.

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; }

Puede utilizar la siguiente versión de StaticTableSchema de los esquemas de tabla en lugar de las anotaciones de los beans.

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(); }