Search code examples
amazon-web-serviceskotlinamazon-dynamodbaws-java-sdk-2.x

Nested beans with StaticTableSchema & enhanced DynamoDB client from AWS Java SDK 2.x


How do I create a StaticTableSchema for a nested bean (like for the items property here)?

data class Order(
    var id: Long = 0L,
    var items: List<OrderLineItem> = emptyList(),
    …
)
data class OrderLineItem(
    var id: Long = 0L,
    var price: BigDecimal = 0.0.toBigDecimal(),
    …
)

Solution

  • First, create a TableSchema implementation for the nested bean. It could be a StaticTableSchema or a BeanTableSchema:

    val orderLineItemStaticTableSchema = TableSchema
        .builder(OrderLineItem::class.java)
        .newItemSupplier(::OrderLineItem)
        .addAttribute(Long::class.java) {
            it.name("id").getter(OrderLineItem::id::get).setter(OrderLineItem::id::set)
        }
        .addAttribute(BigDecimal::class.java) {
            it.name("price").getter(OrderLineItem::price::get).setter(OrderLineItem::price::set)
        }
        .build()
    
    // or
    
    val orderLineItemBeanTableSchema = TableSchema.fromBean(OrderLineItem::class.java)
    
    

    Then, use this schema instance with EnhancedType.documentOf():

    val tableSchema = TableSchema
        .builder(Order::class.java)
        .newItemSupplier(::Order)
        .addAttribute(Long::class.java) {
            it.name("id").getter(Order::id::get).setter(Order::id::set)
        }
        .addAttribute(
            EnhancedType.listOf(
                EnhancedType.documentOf(OrderLineItem::class.java, orderLineItemTableSchema)
            )
        ) {
            it.name("items").getter(Order::items::get).setter(Order::items::set)
        }
        .build()