gpt4 book ai didi

kotlin - 绑定(bind)自定义数据类型将 null 传输到转换器

转载 作者:行者123 更新时间:2023-12-02 13:23:15 25 4
gpt4 key购买 nike

我在我的项目中使用 Jooq 和 Kotlin。我有对象 EventEnvelope,其中组成了 Event 类型的字段。我想将此字段作为 JSON 存储在我的数据库(postgres)中。我准备了 jooq 自定义数据类型绑定(bind)和转换器,如此处所述 -> https://www.jooq.org/doc/3.10/manual/code-generation/custom-data-type-bindings/
下面我粘贴转换器、绑定(bind)和 gradle 生成器代码。

我的问题是:

  • 可以将 kotlin 非 null 类型与 jooq 绑定(bind)一起使用吗?
  • 这个配置可以吗?我应该改变什么?
  • 当我想存储值时,我的转换器从 func 获取 null。我不知道为什么会这样。

  • 我不知道该怎么做才能解决它。
    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
    }
    }

    最佳答案

    Is it ok to use kotlin non null types with jooq bindings?



    jOOQ(或任何 Java 库)不会尊重您的 Kotlin 不可为空的保证,并且可能会在您不期望的地方产生空值。所以,也许这毕竟不是一个好主意。

    在 jOOQ 和您的代码之间的接口(interface)处,您必须确保自己不会发生这种情况。

    Is this configuration ok? What should I change?



    这是一个开放式问题。如果您有任何具体问题,请提出。

    When I want to store value my converter gets null in from func. I don't why is that.



    您的问题中没有足够的信息来帮助您解决这个问题

    关于kotlin - 绑定(bind)自定义数据类型将 null 传输到转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50682580/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com