翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
属性変換を制御する
デフォルトでは、テーブルスキーマは、AttributeConverterProvider
インターフェイスのデフォルトの実装を通じて、多くの一般的な Java タイプのコンバーターを提供します。全体的なデフォルト動作は、カスタム AttributeConverterProvider
実装で変更できます。また、1 つの属性のコンバーターを変更することもできます。
使用可能なコンバーターのリストについては、AttributeConverter
カスタム属性コンバータープロバイダーを提供する
@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
クラスがリストされています。
次の例の 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; } }