プロパティコンバーター
型ベースの変換は、ターゲットストア内の特定の型の変換と表現に影響を与える方法をすでに提供していますが、特定の型の特定の値またはプロパティのみを変換の対象として考慮する必要がある場合には制限があります。プロパティベースのコンバーターを使用すると、宣言的 ( @ValueConverter
経由) またはプログラム的 (特定のプロパティの PropertyValueConverter
の登録による) で、プロパティごとに変換ルールを構成できます。
PropertyValueConverter
は、次のように、指定された値をそのストア表現に変換 (書き込み) したり、逆に変換したり (読み取り) できます。追加の ValueConversionContext
は、マッピングメタデータやダイレクト read
および write
メソッドなどの追加情報を提供します。
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
アノテーションをプロパティに付加することです。
class Person {
@ValueConverter(ReversingValueConverter.class)
String ssn;
}
プログラムによる値コンバーターの登録
次の例に示すように、プログラムによる登録では、PropertyValueConverterRegistrar
を使用してエンティティモデル内のプロパティの 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
の定義に役立ちます。
MongoCustomConversions.create(configurationAdapter -> {
SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions();
valueConversions.setConverterFactory(…);
valueConversions.setValueConverterRegistry(new PropertyValueConverterRegistrar()
.registerConverter(…)
.buildRegistry());
configurationAdapter.setPropertyValueConversions(valueConversions);
});