

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

# 属性変換を制御する
<a name="ddb-en-client-adv-features-conversion"></a>

デフォルトでは、テーブルスキーマは `[AttributeConverterProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverterProvider.html)` インターフェースのデフォルト実装を通じて、多くの一般的な Java 型のコンバーターを提供します。全体的なデフォルト動作は、カスタム `AttributeConverterProvider` 実装で変更できます。また、1 つの属性のコンバーターを変更することもできます。

使用可能なコンバーターのリストについては、「[AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html) インターフェースの Java ドキュメント」を参照してください。

## カスタム属性コンバータープロバイダーを提供する
<a name="ddb-en-client-adv-features-conversion-prov"></a>

`@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();
```

## 単一の属性のマッピングをオーバーライドする
<a name="ddb-en-client-adv-features-conversion-single"></a>

単一の属性のマッピング方法をオーバーライドするには、その属性に `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();
```

## 例
<a name="ddb-en-client-adv-features-conversion-example"></a>

この例は、[https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpCookie.html](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpCookie.html) オブジェクトの属性コンバーターを提供する `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);
        }
    }
```

### 変換コード
<a name="ddb-en-client-adv-features-conversion-example-code"></a>

次の `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;
        }
    }
```