Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 绑定自定义数据类型将null传输到转换器_Kotlin_Jooq - Fatal编程技术网

Kotlin 绑定自定义数据类型将null传输到转换器

Kotlin 绑定自定义数据类型将null传输到转换器,kotlin,jooq,Kotlin,Jooq,我在我的项目中使用了Jooq和Kotlin。我有一个对象EventEnvelope,其中包含类型为Event的字段。我想在我的数据库(postgres)中将此字段存储为JSON。我准备了jooq自定义数据类型绑定和转换器,如这里所述-> 下面我粘贴转换器、绑定和渐变生成器代码 我的问题是: 将kotlin非null类型与jooq绑定一起使用可以吗 这个配置可以吗?我应该换什么 当我想存储值时,我的转换器从func中得到null。我不知道这是为什么 我不知道该怎么做才能解决它 class JSON

我在我的项目中使用了Jooq和Kotlin。我有一个对象EventEnvelope,其中包含类型为Event的字段。我想在我的数据库(postgres)中将此字段存储为JSON。我准备了jooq自定义数据类型绑定和转换器,如这里所述-> 下面我粘贴转换器、绑定和渐变生成器代码

我的问题是:

  • 将kotlin非null类型与jooq绑定一起使用可以吗

  • 这个配置可以吗?我应该换什么

  • 当我想存储值时,我的转换器从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
        }
    }
    
    类JSONEventConverter构造函数(
    私有val对象映射器:对象映射器,
    私有val schemaMatcher:schemaMatcher
    ):转换器{
    覆盖来自(数据库对象:任意):事件{
    返回schemaMatcher.parse(databaseObject.toString())
    }
    覆盖乐趣到(userObject:Event):任意{
    返回objectMapper.writeValueAsString(userObject)
    }
    重写fromType():类{
    返回Any::class.java
    }
    重写fun toType():类{
    返回事件::class.java
    }
    伴星{
    乐趣创建():JSONEventConverter{
    返回JSONEventConverter(JacksonObject映射器(),
    SchemaMatcher.create())
    }
    }
    }
    类PostgresJSONEventBinding:绑定{
    覆盖有趣的寄存器(ctx:BindingRegisterContext?){
    ctx!!.statement().registerOutParameter(ctx.index(),Types.VARCHAR)
    }
    重写有趣的sql(ctx:BindingSQLContext?){
    ctx!!.render().visit(DSL.val`)(ctx.convert(converter())
    .value()).sql(“::json”)
    }
    覆盖乐趣转换器():转换器{
    返回JSONEventConverter.create()
    }
    覆盖有趣的获取(ctx:bindingGetResultContext?{
    ctx!!.convert(converter())
    .value(ctx.resultSet().getString(ctx.index()))
    }
    重写fun-get(ctx:BindingGetStatementContext?){
    ctx!!.convert(converter())
    .value(ctx.statement().getString(ctx.index()))
    }
    重写fun-get(ctx:BindingGetSQLInputContext?){
    抛出SQLFeatureNotSupportedException()
    }
    覆盖乐趣集(ctx:BindingSetStatementContext?){
    ctx!!.statement().setString(ctx.index(),
    Objects.toString(ctx.convert(converter()).value(),null))
    }
    覆盖乐趣集(ctx:BindingSetSQLOutputContext?){
    抛出SQLFeatureNotSupportedException()
    }
    }
    发电机{
    name='org.jooq.util.DefaultGenerator'
    策略{
    name='org.jooq.util.DefaultGeneratorStrategy'
    }
    数据库{
    name='org.jooq.util.postgres.PostgresDatabase'
    图式{
    模式{
    inputSchema=someSchema
    }
    模式{
    inputSchema=otherSchema
    }
    }
    强制类型{
    强制打字{
    userType='package.Event'
    binding='package.PostgresJSONEventBinding'
    表达式='someSchema\\.event\\.store\\.event'
    }
    }
    }
    产生{
    关系=真
    不推荐=错误
    记录=真
    immutablePojos=true
    fluentSetters=true
    }
    目标{
    packageName=appName
    }
    }
    
    将kotlin非null类型与jooq绑定一起使用可以吗

    jOOQ(或任何Java库)都不会遵守Kotlin不可为null的保证,并且可能会在您不希望的地方生成null值。所以,也许这毕竟不是一个好主意

    在jOOQ和代码之间的接口处,您必须确保这不会发生

    这个配置可以吗?我应该换什么

    这是一个开放的问题。如果您有任何具体问题,请询问

    当我想存储值时,我的转换器从func中得到null。我不知道这是为什么


    您的问题中没有足够的信息来帮助您解决这个问题,所以在我的例子中,是关于java中可空类型和kotlin中非空类型之间的java kotlin互操作性。我所要做的就是在kotlin中使用可为null的类型(那些带有
    )实现转换器

    正确的转换器如下所示:

    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())
            }
        }
    }
    
    类JSONEventConverter构造函数(
    私有val对象映射器:对象映射器,
    私有val schemaMatcher:schemaMatcher
    ):转换器{
    覆盖来自(databaseObject:任何?):事件的乐趣{
    返回databaseObject?.let{schemaMatcher.parse(it.toString())}
    }
    将乐趣覆盖到(userObject:Event?):有吗{
    返回userObject?.let{objectMapper.writeValueAsString(it)}
    }
    重写fromType():类{
    返回Any::class.java
    }
    重写fun toType():类{
    返回事件::class.java
    }
    伴星{
    乐趣创建():JSONEventConverter{
    返回JSONEventConverter(serializingObjectMapper(),
    SchemaMatcher.create())
    }
    }
    }
    
    您的问题将3个问题混合在一起。在这里,很难知道你真正想要的是什么。你到底遇到了什么问题?试着把你的问题集中在那个问题上。回答起来容易多了。谢谢你(一如既往)的回答。我又在想我的问题,为了精确我的问题,我解决了它。谢谢你鼓舞人心的回答。既然这个问题没用,我应该把它去掉吗?@Piotrowy:不,不要把它去掉。你自己回答!:-)其他人可能仍然觉得它有用。。。