JetBrains / Exposed

Kotlin SQL Framework
http://jetbrains.github.io/Exposed/
Apache License 2.0
8.24k stars 686 forks source link

Weird NotSerializableException #542

Closed lamba92 closed 5 years ago

lamba92 commented 5 years ago

I am switching from SQL Server to MySQL. I had no troubles with the first but now creating a new entity throws a:

11:04:38.923 [pool-3-thread-1] ERROR ktor.application - Unhandled: POST - /api/newCamera
java.sql.SQLException: Invalid argument value: java.io.NotSerializableException
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85)
    at com.mysql.cj.jdbc.ClientPreparedStatement.setObject(ClientPreparedStatement.java:1701)
    at org.jetbrains.exposed.sql.IColumnType$DefaultImpls.setParameter(ColumnType.kt:56)
    at org.jetbrains.exposed.sql.ColumnType.setParameter(ColumnType.kt:60)
    at org.jetbrains.exposed.sql.statements.StatementKt.fillParameters(Statement.kt:116)
    at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed(Statement.kt:51)
    at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:131)
    at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:125)
    at org.jetbrains.exposed.sql.statements.Statement.execute(Statement.kt:29)
    at org.jetbrains.exposed.sql.QueriesKt.batchInsert(Queries.kt:90)
    at org.jetbrains.exposed.sql.QueriesKt.batchInsert$default(Queries.kt:60)
    at org.jetbrains.exposed.dao.EntityCache.flushInserts$exposed(Entity.kt:451)
    at org.jetbrains.exposed.dao.EntityID.getValue(Entity.kt:23)
    at org.jetbrains.exposed.dao.Entity.setValue(Entity.kt:244)
    at it.synesthesia.rivelat.mainserver.database.daos.Camera.setNode(Camera.kt)
    at it.synesthesia.rivelat.mainserver.server.ExtensionsKt$buildRouteForNewCameras$1$1$1.invoke(Extensions.kt:29)
    at it.synesthesia.rivelat.mainserver.server.ExtensionsKt$buildRouteForNewCameras$1$1$1.invoke(Extensions.kt)
    at org.jetbrains.exposed.dao.EntityClass.new(Entity.kt:672)
    at org.jetbrains.exposed.dao.EntityClass.new(Entity.kt:649)
    at it.synesthesia.rivelat.mainserver.server.ExtensionsKt$buildRouteForNewCameras$1$1.invoke(Extensions.kt:25)
    at it.synesthesia.rivelat.mainserver.server.ExtensionsKt$buildRouteForNewCameras$1$1.invoke(Extensions.kt)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:104)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:75)
        ...
Caused by: com.mysql.cj.exceptions.WrongArgumentException: Invalid argument value: java.io.NotSerializableException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    at com.mysql.cj.AbstractQueryBindings.setSerializableObject(AbstractQueryBindings.java:598)
    at com.mysql.cj.AbstractQueryBindings.setObject(AbstractQueryBindings.java:263)
    at com.mysql.cj.jdbc.ClientPreparedStatement.setObject(ClientPreparedStatement.java:1699)
    ... 61 common frames omitted
Caused by: java.io.NotSerializableException: org.jetbrains.exposed.dao.EntityID
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at com.mysql.cj.AbstractQueryBindings.setSerializableObject(AbstractQueryBindings.java:587)
    ... 63 common frames omitted

The code is pretty basic and uses only DAOs:

defaultTransaction {
    Camera.new {
        createdAt = DateTime(data.ts)
        node =
            Node.findOneOrNull { NodeTable.name eq data.nodeId }
                ?: Node.new { // <-- it errors here
                    name = data.nodeId
                    code = data.nodeId
                    createdAt = DateTime()
                    application =
                        Application.findOneOrNull { ApplicationTable.name eq "DEV" }
                            ?: Application.new {
                                name = "DEV"
                            }
                }
        code = data.data["id"].toString().toDouble().toInt().toString()
        name = data.data.getValue("customName") as String
        configurationData = null
    }
}

fun <T> defaultTransaction(function: Transaction.() -> T)
        = transaction(Settings.remoteDatabase, function)

fun <ID : Comparable<ID>, T : Entity<ID>> EntityClass<ID, T>.findOneOrNull(op: SqlExpressionBuilder.() -> Op<Boolean>) =
    find(op).singleOrNull()

I think it may be related to this but I'm not sure.

The MySQL DB is an AWS RDS instance using MySQL 5.6; my application is erroring with mysql:mysql-connector-java:8.0.15/5.1.46 drivers, JDK 1.8 and 11, macOs.

lamba92 commented 5 years ago

Nvm, updating Exposed to latest fixed it.