本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
控制屬性轉換
根據預設,資料表結構描述會透過AttributeConverterProvider
介面的預設實作,為許多常見 Java 類型提供轉換器。您可以使用自訂AttributeConverterProvider
實作來變更整體預設行為。您也可以變更單一屬性的轉換器。
有關可用轉換器的列表,請參閱接AttributeConverter
提供自訂屬性轉換器提供
您可以透過@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
類。
下列範例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; } }