控制屬性轉換 - AWS SDK for Java 2.x

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

控制屬性轉換

根據預設,資料表結構描述透過AttributeConverterProvider介面的預設實作,為許多常見的 Java 類型提供轉換器。您可以使用自訂AttributeConverterProvider實作變更整體預設行為。您也可以變更單一屬性的轉換器。

如需可用轉換器的清單,請參閱AttributeConverter介面 Java 文件。

提供自訂屬性轉換器供應商

您可以透過@DynamoDbBean(converterProviders = {…})註釋提供單一 AttributeConverterProvider或一組有序 AttributeConverterProvider。任何自訂AttributeConverterProvider都必須擴展AttributeConverterProvider介面。

請注意,如果您提供自己的屬性轉換器鏈提供者,您將覆寫預設轉換器提供者 DefaultAttributeConverterProvider。如果您想要使用 的功能DefaultAttributeConverterProvider,則必須將其包含在鏈中。

您也可以使用空陣列 註釋豆類{}。這會停用任何屬性轉換器提供者,包括預設值。在這種情況下,要映射的所有屬性都必須有自己的屬性轉換器。

下列程式碼片段顯示單一轉換器提供者。

@DynamoDbBean(converterProviders = ConverterProvider1.class) public class Customer { }

下列程式碼片段顯示轉換器供應商鏈的使用。由於SDK預設值是最後提供的,因此具有最低的優先順序。

@DynamoDbBean(converterProviders = { ConverterProvider1.class, ConverterProvider2.class, DefaultAttributeConverterProvider.class}) public class Customer { }

靜態資料表結構描述建置器具有以相同方式運作attributeConverterProviders()的方法。這會顯示在下列程式碼片段中。

private static final StaticTableSchema<Customer> CUSTOMER_TABLE_SCHEMA = StaticTableSchema.builder(Customer.class) .newItemSupplier(Customer::new) .addAttribute(String.class, a -> a.name("name") a.getter(Customer::getName) a.setter(Customer::setName)) .attributeConverterProviders(converterProvider1, converterProvider2) .build();

覆寫單一屬性的映射

若要覆寫單一屬性的映射方式,AttributeConverter請為 屬性提供 。此新增會覆寫資料表結構描述AttributeConverterProviders中 提供的任何轉換器。這只會為該屬性新增自訂轉換器。其他屬性,即使是相同類型的屬性,也不會使用該轉換器,除非針對其他屬性明確指定。

@DynamoDbConvertedBy 註釋用於指定自訂AttributeConverter類別,如下列程式碼片段所示。

@DynamoDbBean public class Customer { private String name; @DynamoDbConvertedBy(CustomAttributeConverter.class) public String getName() { return this.name; } public void setName(String name) { this.name = name;} }

靜態結構描述的建置器具有同等的屬性建置器attributeConverter()方法。此方法需要 的執行個體AttributeConverter,如下所示。

private static final StaticTableSchema<Customer> CUSTOMER_TABLE_SCHEMA = StaticTableSchema.builder(Customer.class) .newItemSupplier(Customer::new) .addAttribute(String.class, a -> a.name("name") a.getter(Customer::getName) a.setter(Customer::setName) a.attributeConverter(customAttributeConverter)) .build();

範例

此範例顯示為java.net.HttpCookie物件提供屬性轉換器的AttributeConverterProvider實作。

下列SimpleUser類別包含名為 的屬性lastUsedCookie,該屬性是 的執行個體HttpCookie

@DynamoDbBean 註釋的 參數會列出提供轉換器的兩個AttributeConverterProvider類別。

Class with annotations
@DynamoDbBean(converterProviders = {CookieConverterProvider.class, DefaultAttributeConverterProvider.class}) public static final class SimpleUser { private String name; private HttpCookie lastUsedCookie; @DynamoDbPartitionKey public String getName() { return name; } public void setName(String name) { this.name = name; } public HttpCookie getLastUsedCookie() { return lastUsedCookie; } public void setLastUsedCookie(HttpCookie lastUsedCookie) { this.lastUsedCookie = lastUsedCookie; }
Static table schema
private static final TableSchema<SimpleUser> SIMPLE_USER_TABLE_SCHEMA = TableSchema.builder(SimpleUser.class) .newItemSupplier(SimpleUser::new) .attributeConverterProviders(CookieConverterProvider.create(), AttributeConverterProvider.defaultProvider()) .addAttribute(String.class, a -> a.name("name") .setter(SimpleUser::setName) .getter(SimpleUser::getName) .tags(StaticAttributeTags.primaryPartitionKey())) .addAttribute(HttpCookie.class, a -> a.name("lastUsedCookie") .setter(SimpleUser::setLastUsedCookie) .getter(SimpleUser::getLastUsedCookie)) .build();

CookieConverterProvider 下列範例中的 提供 的執行個體HttpCookeConverter

public static final class CookieConverterProvider implements AttributeConverterProvider { private final Map<EnhancedType<?>, AttributeConverter<?>> converterCache = ImmutableMap.of( // 1. Add HttpCookieConverter to the internal cache. EnhancedType.of(HttpCookie.class), new HttpCookieConverter()); public static CookieConverterProvider create() { return new CookieConverterProvider(); } // The SDK calls this method to find out if the provider contains a AttributeConverter instance // for the EnhancedType<T> argument. @SuppressWarnings("unchecked") @Override public <T> AttributeConverter<T> converterFor(EnhancedType<T> enhancedType) { return (AttributeConverter<T>) converterCache.get(enhancedType); } }

轉換碼

在下列HttpCookieConverter類別transformFrom()的方法中,程式碼會接收HttpCookie執行個體,並將其轉換為儲存為 屬性的 DynamoDB 映射。

transformTo()方法會收到 DynamoDB HttpCookie 映射參數,然後調用需要名稱和值的建構器。

public static final class HttpCookieConverter implements AttributeConverter<HttpCookie> { @Override public AttributeValue transformFrom(HttpCookie httpCookie) { return AttributeValue.fromM( Map.of ("cookieName", AttributeValue.fromS(httpCookie.getName()), "cookieValue", AttributeValue.fromS(httpCookie.getValue())) ); } @Override public HttpCookie transformTo(AttributeValue attributeValue) { Map<String, AttributeValue> map = attributeValue.m(); return new HttpCookie( map.get("cookieName").s(), map.get("cookieValue").s()); } @Override public EnhancedType<HttpCookie> type() { return EnhancedType.of(HttpCookie.class); } @Override public AttributeValueType attributeValueType() { return AttributeValueType.M; } }