最新の安定バージョンについては、Spring Data Cassandra 5.1.0 を使用してください! |
カスタム変換
次の Spring Converter 実装の例は、String からカスタム Email 値オブジェクトに変換します。
@ReadingConverter
public class EmailReadConverter implements Converter<String, Email> {
public Email convert(String source) {
return Email.valueOf(source);
}
} ソースとターゲットの型がネイティブ型である Converter を記述した場合、それを読み取りコンバーターと見なすか、書き込みコンバーターと見なすべきかを判断できません。コンバーターインスタンスを両方として登録すると、望ましくない結果が生じる可能性があります。例: Converter<String, Long> があいまいですが、書き込み時にすべての String インスタンスを Long インスタンスに変換しようとしても意味がありません。インフラストラクチャーにコンバーターを一方向にのみ登録させるために、コンバーターの実装で使用される @ReadingConverter および @WritingConverter アノテーションを提供します。
インスタンスはクラスパスまたはコンテナースキャンから取得されないため、コンバーターは明示的な登録の対象となります。変換サービスへの不要な登録と、そのような登録に起因する副作用を回避するためです。コンバーターは、ソースおよびターゲットの型に基づいて、登録されたコンバーターの登録および照会を可能にする中央機能として CustomConversions に登録されます。
CustomConversions には、事前に定義された一連のコンバーター登録が付属しています。
java.time、java.util.Date、String型間の変換用の JSR-310 コンバーター。
ローカルテンポラル型(LocalDateTime から java.util.Date など)のデフォルトコンバーターは、システムデフォルトのタイムゾーン設定に依存して、これらの型間で変換します。独自のコンバーターを登録することにより、デフォルトのコンバーターをオーバーライドできます。 |
コンバーターの明確化
一般に、Converter の実装は、変換元と変換先のソース型とターゲット型をインスペクションします。これらの 1 つが、基になるデータアクセス API がネイティブに処理できる型かどうかに応じて、コンバーターインスタンスを読み取りまたは書き込みコンバーターとして登録します。次の例は、書き込みコンバーターと読み取りコンバーターを示しています(違いは Converter の修飾子の順序にあることに注意してください)。
// Write converter as only the target type is one that can be handled natively
class MyConverter implements Converter<Person, String> { … }
// Read converter as only the source type is one that can be handled natively
class MyConverter implements Converter<String, Person> { … }カスタムコンバーターによるデフォルトマッピングのオーバーライド
マッピングプロセスをよりきめ細かく制御するには、Spring Converters を MappingCassandraConverter などの CassandraConverter 実装に登録できます。
MappingCassandraConverter は、オブジェクト自体のマップを試みる前に、まず Spring Converters が特定のクラスを処理できるかどうかを確認します。MappingCassandraConverter の通常のマッピング戦略を「ハイジャック」するには (おそらくパフォーマンスの向上やその他のカスタムマッピングのニーズのため)、Spring Converter インターフェースの実装を作成し、それを MappingCassandraConverter に登録する必要があります。
登録した Spring コンバーターを使用して保存する
基本的にコンバーターを使用して保存を行うことで、変換と保存を 1 つのプロセスで組み合わせることができます。
次の例では、Converter を使用して、Person オブジェクトを Jackson 2 を持つ java.lang.String に変換します。
class PersonWriteConverter implements Converter<Person, String> {
public String convert(Person source) {
try {
return new ObjectMapper().writeValueAsString(source);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}Spring コンバーターを使用した読み取り
保存と変換を組み合わせる方法と同様に、読み取りと変換も組み合わせることができます。
次の例では、Jackson 2 を使用して java.lang.String を Person オブジェクトに変換する Converter を使用します。
class PersonReadConverter implements Converter<String, Person> {
public Person convert(String source) {
if (StringUtils.hasText(source)) {
try {
return new ObjectMapper().readValue(source, Person.class);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
return null;
}
}Spring コンバーターを CassandraConverter に登録する
Apache Cassandra の Spring Data Java 構成では、Spring Converter インスタンスを登録する便利な方法が提供されます: MappingCassandraConverter。次の構成スニペットは、コンバーターを手動で登録し、CustomConversions を構成する方法を示しています。
@Configuration
public class ConverterConfiguration extends AbstractCassandraConfiguration {
@Override
public CassandraCustomConversions customConversions() {
return CassandraCustomConversions.create(config -> {
config.registerConverter(new PersonReadConverter()));
config.registerConverter(new PersonWriteConverter()));
});
}
// other methods omitted...
}