最新の安定バージョンについては、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.timejava.util.DateString 型間の変換用の 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...

}