Testato con org.springframework.data:spring-data-r2dbc:1.0.0.RELEASE
e io.r2dbc:r2dbc-postgresql:0.8.1.RELEASE
.
Versione Kotlin.
-
Definisci una classe enum
enum class Mood { UNKNOWN, HAPPY, SAD }
-
Crea un codec personalizzato
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 } }
-
Registra il codec
Potrebbe essere necessario modificare
runtimeOnly("io.r2dbc:r2dbc-postgresql")
all'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) } }