spring-boot r2dbc: How to read enum as string and convert it to enum

164 Views Asked by At

I have an enum like

enum class Gender(val value: String) {
    MALE("male"),
    FEMALE("female"),
    DIVERSE("diverse"),
    UNKNOWN("unknown");

    companion object {
        fun fromValue(value: String): Gender {
            entries.forEach { v ->
                if (v.value == value) {
                    return v
                }
            }
            throw IllegalArgumentException("No Gender found for value=${value}")
        }
    }
}

This is part of a User model:

@Table(name = "users")
class User (
    @Column("gender")
    var gender: Gender = Gender.DIVERSE,

    @Column("first_name")
    var firstName: String? = null,

    @Column("last_name")
    var lastName: String? = null,

    @Column("country_code")
    var countryCode: String? = null,

    @Column("phone_number")
    var phoneNumber: String? = null,

    @Column("password")
    var password: String? = null,

    @Column("email")
    var email: String? = null
): BaseEntity()

I have registered custom @ReadingConvertes and @WritingConverters. The Writing converter seems to work, but the reading converter doesn't seem to work.

UPDATE: Here is the writing converter. This component works fine and the lower case string values are written in the db.

@WritingConverter
class GenderWritingConverter : Converter<Gender, String> {
    override fun convert(source: Gender): String =
        source.value
}

Here is the Readingconverter. This converter is not called, even if it is registered as a custom converter.

@ReadingConverter
class GenderReadingConverter : Converter<String, Gender> {
    override fun convert(source: String): Gender {
        return Gender.fromValue(source)
    }
}

Here is how I am registering it to the r2dbc config:

@Configuration
class R2dbcConfig(
    private val connectionFactory: ConnectionFactory
): AbstractR2dbcConfiguration() {

    override fun connectionFactory(): ConnectionFactory = connectionFactory
    @Bean
    override fun r2dbcCustomConversions(): R2dbcCustomConversions =
        R2dbcCustomConversions(storeConversions, 
            mutableListOf(GenderReadingConverter(),GenderWritingConverter()))
}

While converting the value from the db, I have following exception:

java.lang.IllegalArgumentException: No enum constant Gender.diverse
0

There are 0 best solutions below