Привязка пользовательского типа данных передает ноль в конвертер - PullRequest
0 голосов
/ 04 июня 2018

Я использую Jooq и Kotlin в своем проекте.У меня есть объект EventEnvelope, в котором составлено поле типа Event.Я хочу сохранить это поле как JSON в моей БД (postgres).Я подготовил привязки и преобразователь пользовательских типов данных jooq, как описано здесь -> https://www.jooq.org/doc/3.10/manual/code-generation/custom-data-type-bindings/ Ниже я вставляю код преобразователя, привязки и генератора градлов.

Мои вопросы:

  1. Можно ли использовать kotlin ненулевых типов с привязками jooq?

  2. Эта конфигурацияОК?Что я должен изменить?

  3. Когда я хочу сохранить значение, мой конвертер получает нулевое значение от func.Я не знаю, почему это так.

У меня нет идей, что мне делать, чтобы это исправить.

class JSONEventConverter constructor(
    private val objectMapper: ObjectMapper,
    private val schemaMatcher: SchemaMatcher
) : Converter<Any, Event> {
    override fun from(databaseObject: Any): Event {
        return schemaMatcher.parse(databaseObject.toString())
    }

    override fun to(userObject: Event): Any {
        return objectMapper.writeValueAsString(userObject)
    }

    override fun fromType(): Class<Any> {
        return Any::class.java
    }

    override fun toType(): Class<Event> {
        return Event::class.java
    }

    companion object {
        fun create(): JSONEventConverter {
            return JSONEventConverter(jacksonObjectMapper(), 
                SchemaMatcher.create())
        }
    }
}

class PostgresJSONEventBinding : Binding<Any, Event> {
    override fun register(ctx: BindingRegisterContext<Event>?) {
        ctx!!.statement().registerOutParameter(ctx.index(), Types.VARCHAR)
    }

    override fun sql(ctx: BindingSQLContext<Event>?) {
        ctx!!.render().visit(DSL.`val`(ctx.convert(converter())
            .value())).sql("::json")
    }

    override fun converter(): Converter<Any, Event> {
        return JSONEventConverter.create()
    }

    override fun get(ctx: BindingGetResultSetContext<Event>?) {     
        ctx!!.convert(converter())
            .value(ctx.resultSet().getString(ctx.index()))
    }

    override fun get(ctx: BindingGetStatementContext<Event>?) {
        ctx!!.convert(converter())
            .value(ctx.statement().getString(ctx.index()))
    }

    override fun get(ctx: BindingGetSQLInputContext<Event>?) {
        throw SQLFeatureNotSupportedException()
    }

    override fun set(ctx: BindingSetStatementContext<Event>?) {
        ctx!!.statement().setString(ctx.index(), 
            Objects.toString(ctx.convert(converter()).value(), null))
    }

    override fun set(ctx: BindingSetSQLOutputContext<Event>?) {
        throw SQLFeatureNotSupportedException()
    }
}

generator {
    name = 'org.jooq.util.DefaultGenerator'
    strategy {
        name = 'org.jooq.util.DefaultGeneratorStrategy'
    }
    database {
        name = 'org.jooq.util.postgres.PostgresDatabase'
        schemata {
            schema {
                inputSchema = someSchema
            }
            schema {
                inputSchema = otherSchema
            }
        }
        forcedTypes {
            forcedType {
                userType = 'package.Event'
                binding = 'package.PostgresJSONEventBinding'
                expression = 'someSchema\\.event_store\\.event'
            }
        }
    }
    generate {
        relations = true
        deprecated = false
        records = true
        immutablePojos = true
        fluentSetters = true
    }
    target {
        packageName = appName
    }
}

Ответы [ 2 ]

0 голосов
/ 22 июня 2018

Хорошо, в моем случае речь шла о совместимости java-kotlin между обнуляемыми типами в Java и ненулевыми типами в kotlin.Все, что мне нужно было сделать, это реализовать конвертер с использованием обнуляемых типов в kotlin (с ?).

Правильный конвертер выглядит так:

class JSONEventConverter constructor(
    private val objectMapper: ObjectMapper,
    private val schemaMatcher: SchemaMatcher
) : Converter<Any, Event> {
    override fun from(databaseObject: Any?): Event? {
        return databaseObject?.let { schemaMatcher.parse(it.toString()) }
    }

    override fun to(userObject: Event?): Any? {
        return userObject?.let { objectMapper.writeValueAsString(it) }
    }

    override fun fromType(): Class<Any> {
        return Any::class.java
    }

    override fun toType(): Class<Event> {
        return Event::class.java
    }

    companion object {
        fun create(): JSONEventConverter {
            return JSONEventConverter(serializingObjectMapper(),         
                SchemaMatcher.create())
        }
    }
}
0 голосов
/ 05 июня 2018

Можно ли использовать ненулевые типы kotlin с привязками jooq?

jOOQ (или любая библиотека Java) не будет соблюдать ваши ненулевые гарантии Kotlin и может привести к нулевым значениям, еслиВы не ожидаете их.Так что, возможно, это не очень хорошая идея.

На интерфейсе между jOOQ и вашим кодом вы должны убедиться, что этого не произойдет.

Эта конфигурация в порядке?Что я должен изменить?

Это открытый вопрос.Если у вас есть какие-либо конкретные вопросы, пожалуйста, задавайте.

Когда я хочу сохранить значение, мой конвертер получает нулевое значение от func.Я не знаю, почему это так.

В вашем вопросе недостаточно информации, чтобы помочь вам в этом

...