我该如何序列化Kotlin Exposed SQL Dao?

4

我在我的项目中使用kotlin exposed sql,我为我的表创建了kotlin对象,也按照示例创建了DAO,一切都正常工作,但是当我想返回我的DAO对象的列表时,我会得到以下结果:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]->java.util.ArrayList[0]->org.jetbrains.exposed.sql.Column["table"]->org.domcek.dto.Page["columns"]....

我在我的 KTOR 应用程序中使用 jackson。

我的 DAO:

class PageDao(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<PageDao>(Page)

    var title by Page.title
    var body by Page.body
    var parentId by Page.parentId
    var active by Page.active
    var order by Page.order
    var slug by Page.slug

    var children: List<PageDao>? = null

    fun isMyParent(pageId: Int): Boolean {
        return pageId == this.parentId
    }
}

我的处理程序:

suspend fun findAll(call: ApplicationCall) {
        val pages = pageRepository.getMainPages()

        call.respond(pages)
    }

代码库:

fun getMainPages(): List<PageDao> {
        return transaction {
            addLogger(StdOutSqlLogger)

            return@transaction PageDao.find {
                Page.active.eq(true)
                Page.parentId.isNull()
            }.toList()
        }
    }
1个回答

9

我认为最简单的方法是使用数据传输对象(DTO)。例如(用户 - DAO类):

class UserJson(val name:String=""){ constructor(user: User):this(user.name) }

回应:

      get(""){
        val users = ArrayList<UserJson>()
        transaction {
            for (user in User.all())
                users.add(UserJson(user))
        }
        call.respond(users)
    }

使用JacksonView或字段注释似乎是一种更加复杂的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接