org.springframework.data:spring-data-r2dbc:1.0.0.RELEASE
でテスト済み およびio.r2dbc:r2dbc-postgresql:0.8.1.RELEASE
。
Kotlinバージョン。
-
列挙型クラスを定義する
enum class Mood { UNKNOWN, HAPPY, SAD }
-
カスタムコーデックを作成する
class MoodCodec(private val allocator: ByteBufAllocator) : Codec<Mood> { override fun canEncodeNull(type: Class<*>): Boolean = false override fun canEncode(value: Any): Boolean = value is Mood override fun encode(value: Any): Parameter { return Parameter(Format.FORMAT_TEXT, oid) { ByteBufUtils.encode(allocator, (value as Mood).name) } } override fun canDecode(dataType: Int, format: Format, type: Class<*>): Boolean = dataType == oid override fun decode(buffer: ByteBuf?, dataType: Int, format: Format, type: Class<out Mood>): Mood? { buffer ?: return null return Mood.valueOf(ByteBufUtils.decode(buffer)) } override fun type(): Class<*> = Mood::class.java override fun encodeNull(): Parameter = Parameter(Format.FORMAT_TEXT, oid, Parameter.NULL_VALUE) companion object { // Get form `select oid from pg_type where typname = 'mood'` private const val oid = YOUR_ENUM_OID } }
-
コーデックを登録する
runtimeOnly("io.r2dbc:r2dbc-postgresql")
の変更が必要になる場合がありますimplementation("io.r2dbc:r2dbc-postgresql")
へ@Configuration @EnableR2dbcRepositories class AppConfig : AbstractR2dbcConfiguration() { override fun connectionFactory(): ConnectionFactory = PostgresqlConnectionConfiguration.builder() .port(5432) // Add your config here. .codecRegistrar { _, allocator, registry -> registry.addFirst(MoodCodec(allocator)) Mono.empty() }.build() .let { PostgresqlConnectionFactory(it) } }