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

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

控制屬性轉換

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

有關可用轉換器的列表,請參閱接AttributeConverter口 Java 文檔。

提供自訂屬性轉換器提供

您可以透過@DynamoDbBean(converterProviders = {…})註釋提供單一AttributeConverterProvider或一連串有序的 AttributeConverterProvider s。任何自定義都AttributeConverterProvider必須擴展AttributeConverterProvider接口。

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

也可以用空數組註釋 bean {}。這會停用任何屬性轉換器提供者的使用,包括預設值。在這種情況下,要對應的所有屬性都必須有自己的屬性轉換器。

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

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