プロパティコンバーター

型ベースの変換は、ターゲットストア内の特定の型の変換と表現に影響を与える方法をすでに提供していますが、特定の型の特定の値またはプロパティのみを変換の対象として考慮する必要がある場合には制限があります。プロパティベースのコンバーターを使用すると、宣言的 ( @ValueConverter 経由) またはプログラム的 (特定のプロパティの PropertyValueConverter の登録による) で、プロパティごとに変換ルールを構成できます。

PropertyValueConverter は、次のように、指定された値をそのストア表現に変換 (書き込み) したり、逆に変換したり (読み取り) できます。追加の ValueConversionContext は、マッピングメタデータやダイレクト read および write メソッドなどの追加情報を提供します。

例 1: シンプルな PropertyValueConverter
class ReversingValueConverter implements PropertyValueConverter<String, String, ValueConversionContext> {

  @Override
  public String read(String value, ValueConversionContext context) {
    return reverse(value);
  }

  @Override
  public String write(String value, ValueConversionContext context) {
    return reverse(value);
  }
}

CustomConversions#getPropertyValueConverter(…) から PropertyValueConverter インスタンスを取得するには、PropertyValueConversions に委譲します。通常は、実際のコンバーターを提供する PropertyValueConverterFactory を使用します。アプリケーションのニーズに応じて、たとえばキャッシュを適用するために、チェーンを装飾したり、PropertyValueConverterFactory の複数のインスタンスを装飾したりできます。デフォルトでは、Spring Data MongoDB は、デフォルトのコンストラクターまたは列挙値を持つ型を提供できるキャッシュ実装を使用します。事前定義された一連のファクトリは、PropertyValueConverterFactory のファクトリメソッドを通じて利用できます。PropertyValueConverterFactory.beanFactoryAware(…) を使用して、ApplicationContext から PropertyValueConverter インスタンスを取得できます。

ConverterConfiguration を通じてデフォルトの動作を変更できます。

宣言値コンバーター

PropertyValueConverter の最も簡単な使用箇所は、コンバーターの型を定義する @ValueConverter アノテーションをプロパティに付加することです。

例 2: 宣言型 PropertyValueConverter
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

プログラムによる値コンバーターの登録

次の例に示すように、プログラムによる登録では、PropertyValueConverterRegistrar を使用してエンティティモデル内のプロパティの PropertyValueConverter インスタンスを登録します。宣言的登録とプログラムによる登録の違いは、プログラムによる登録は完全にエンティティモデルの外部で行われることです。このようなアプローチは、エンティティモデルにアノテーションを付けることができない場合、またはアノテーションを付けたくない場合に役立ちます。

例 3: プログラマティック PropertyValueConverter 登録
PropertyValueConverterRegistrar registrar = new PropertyValueConverterRegistrar();

registrar.registerConverter(Address.class, "street", new PropertyValueConverter() { … }); (1)

// type safe registration
registrar.registerConverter(Person.class, Person::getSsn())                               (2)
  .writing(value -> encrypt(value))
  .reading(value -> decrypt(value));
1 名前で識別されるフィールドのコンバーターを登録します。
2 コンバーターとその変換関数を登録できる型 セーフなバリアント。このメソッドは、クラスプロキシを使用してプロパティを決定します。クラスもアクセサーも final でないことを確認してください。そうでない場合、このアプローチは機能しません。
コンバーターを登録する場合、プロパティ間をサブドキュメントに移動するためのドット表記法 ( registerConverter(Person.class, "address.street", …) など) はサポートされません。
MongoValueConverter は、MongoConversionContext を使用する事前に型指定された PropertyValueConverter インターフェースを提供します。

MongoCustomConversions の構成

デフォルトでは、MongoCustomConversions は、構成された PropertyValueConverterFactory に応じて、宣言型の値コンバーターを処理できます。MongoConverterConfigurationAdapter は、プログラムによる値変換のセットアップや、使用する PropertyValueConverterFactory の定義に役立ちます。

例 4: 構成サンプル
MongoCustomConversions.create(configurationAdapter -> {

    SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions();
    valueConversions.setConverterFactory(…);
    valueConversions.setValueConverterRegistry(new PropertyValueConverterRegistrar()
        .registerConverter(…)
        .buildRegistry());

    configurationAdapter.setPropertyValueConversions(valueConversions);
});