属性変換を制御する - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

属性変換を制御する

デフォルトでは、テーブルスキーマはAttributeConverterProvider、インターフェイスのデフォルト実装を通じて、多くの一般的な Java タイプのコンバーターを提供します。全体的なデフォルト動作は、カスタム AttributeConverterProvider 実装で変更できます。また、1 つの属性のコンバーターを変更することもできます。

使用可能なコンバータのリストについては、AttributeConverterインターフェイス Java ドキュメントを参照してください。

カスタム属性コンバータープロバイダーを提供する

@DynamoDbBean (converterProviders = {…}) 注釈を使用して、単一の AttributeConverterProvider または順序付けられた AttributeConverterProvider のチェーンを提供することができます。どのようなカスタム 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 クラスには、HttpCookie のインスタンスである lastUsedCookie という名前の属性が含まれています。

@DynamoDbBean 注釈のパラメータには、コンバーターを提供する 2 つの 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; } }