private val nameField: TextField<String> = TextField("name",
model.flatMap { m -> LambdaModel.of( { m.name }, { m.name = it } ) })

(with wicket 10)
The old code works well with Kotlin 1.9
But after upgrading kotlin to 2.x

It shows exception :
private java.lang.Object
org.apache.wicket.MarkupContainer.children[write:1]
[class=org.apache.wicket.markup.html.form.TextField, path=3:form:name]
java.lang.Object org.apache.wicket.Component.data
[class=java.lang.Object] final
org.danekja.java.util.function.serializable.SerializableFunction
org.apache.wicket.model.IModel$4.val$mapper [class=java.lang.Object]

It seems Kotlin 2 no longer produce serializable lambda.
I tried these ways :

class SerializableLambdaModel<T>(
    private val getter: () -> T,
    private val setter: (T) -> Unit
) : IModel<T>, java.io.Serializable {

    override fun getObject(): T = getter()

    override fun setObject(value: T) {
        setter(value)
    }

    override fun detach() {
    }
}
not working

and this

class SerializableLambdaModel<T>(
  getter: () -> T,
  setter: (T) -> Unit
) : IModel<T>, java.io.Serializable {

  private val getterFunc: () -> T = object : java.io.Serializable {
    override fun toString(): String = getter().toString()
    fun get(): T = getter()
  }

  private val setterFunc: (T) -> Unit = object : java.io.Serializable {
    fun set(value: T) = setter(value)
  }

  override fun getObject(): T = getterFunc.get()

  override fun setObject(value: T) {
    setterFunc.set(value)
  }

  override fun detach() {}
}

and this

import org.apache.wicket.model.IModel
import java.io.Serializable

class SerializableLambdaModel<T : Any?>(
    private val getter: () -> T,
    private val setter: (T) -> Unit
) : IModel<T>, Serializable {

    private val getterFunc: SerializableFunction0<T> =
SerializableFunction0(getter)
    private val setterFunc: SerializableFunction1<T> =
SerializableFunction1(setter)

    override fun getObject(): T {
        return getterFunc.invoke()
    }

    override fun setObject(value: T) {
        setterFunc.invoke(value)
    }

    override fun detach() {
    }

    private class SerializableFunction0<T>(private val function: () ->
T) : () -> T, Serializable {
        override fun invoke(): T = function()
    }

    private class SerializableFunction1<T>(private val function: (T)
-> Unit) : (T) -> Unit, Serializable {
        override fun invoke(value: T) = function(value)
    }
}

ALL not working , throws the same error

Is there any way to solve this ?

Thanks.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to