@DynamoDbPreserveEmptyObject을 사용하여 객체를 보존 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

@DynamoDbPreserveEmptyObject을 사용하여 객체를 보존

빈 객체가 있는 Bean을 Amazon DynamoDB에 저장하고 검색 시 SDK가 빈 객체를 다시 생성하도록 하려면 내부 Bean의 접근자에 @DynamoDbPreserveEmptyObject로 주석을 답니다.

주석이 작동하는 방식을 설명하기 위해 코드 예제에서는 다음 두 개의 Bean을 사용합니다.

다음 데이터 클래스에는 두 개의 InnerBean 필드가 있습니다. 접근자 메서드 getInnerBeanWithoutAnno()에는 @DynamoDbPreserveEmptyObject로 주석이 달리지 않습니다. getInnerBeanWithAnno() 메서드에는 주석이 달려 있습니다.

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

다음 InnerBean 클래스의 인스턴스는 MyBean의 필드이며 다음 예제 코드에서는 빈 객체로 초기화됩니다.

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

다음 코드 예제는 초기화된 내부 bean이 있는 MyBean 객체를 DynamoDB에 저장한 후에 항목을 가져옵니다. 기록된 출력은 innerBeanWithoutAnno는 초기화되지 않았지만 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; }

Bean의 주석 대신 다음 StaticTableSchema 버전의 테이블 스키마를 사용할 수 있습니다.

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