Lukasz Kalnik
08/02/2022, 1:39 PMMoshiConverterFactory
for my API calls, however it doesn't support sealed classes containing `object`s.
I'm trying to generate adapters for the sealed class hierarchy using moshi-sealed
, but I still get the error object Always cannot be serialized
. Here the hierarchy:
@Keep
@JsonClass(generateAdapter = true, generator = "sealed:type")
sealed class TriggerCondition(val type: String) : Serializable {
@Keep
@TypeLabel("ALWAYS")
object Always : TriggerCondition("ALWAYS")
@Keep
@TypeLabel("NIGHT")
object Night : TriggerCondition("NIGHT")
@Keep
@TypeLabel("LIGHT_SENSOR")
@JsonClass(generateAdapter = true)
data class LightSensor(
val sensorInfo: SensorInfo,
) : TriggerCondition("LIGHT_SENSOR")
}
Zac Sweers
08/02/2022, 1:43 PMLukasz Kalnik
08/02/2022, 1:44 PMfun create(client: OkHttpClient, baseUrl: String): AirConnectorApi =
Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(MoshiConverterFactory.create(moshiForKotlin))
.addCallAdapterFactory(EitherCallAdapterFactory())
.build()
.create(AirConnectorApi::class.java)
val moshiForKotlin = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
java.lang.IllegalArgumentException: Unable to create converter for class myapp.gatewayapi.data.remote.air.model.AutomationList
for method AirConnectorApi.getAutomations
at retrofit2.Utils.methodError(Utils.java:54)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:126)
at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:85)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy12.getAutomations(Unknown Source)
at myapp.gatewayapi.data.remote.air.AirConnectorApi$DefaultImpls.getAutomations$default(AirConnectorApi.kt:142)
at myapp.gatewayapi.data.remote.common.CommonConnectorApiAirImpl.getAutomations(CommonConnectorApiAirImpl.kt:267)
Caused by: java.lang.IllegalArgumentException: Cannot serialize object declaration myapp.gatewayapi.data.remote.air.model.TriggerCondition$Always
for class myapp.gatewayapi.data.remote.air.model.TriggerCondition triggerCondition
for class myapp.gatewayapi.data.remote.air.model.SensorTrigger
for interface myapp.gatewayapi.data.remote.air.model.AutomationTrigger trigger
for class myapp.gatewayapi.data.remote.air.model.ExistingAutomation
for java.util.List<myapp.gatewayapi.data.remote.air.model.ExistingAutomation> items
for class myapp.gatewayapi.data.remote.air.model.AutomationList
ExistingAutomation
just implements Serializable
, it's not annotated with @JsonClass(...)
Zac Sweers
08/02/2022, 2:08 PMLukasz Kalnik
08/02/2022, 2:10 PMZac Sweers
08/02/2022, 2:10 PMLukasz Kalnik
08/02/2022, 2:10 PMdata class AutomationList(
val total: Int,
val items: List<ExistingAutomation>
)
Zac Sweers
08/02/2022, 2:11 PMLukasz Kalnik
08/02/2022, 2:11 PMsealed interface Automation : Serializable {
val name: String
val trigger: AutomationTrigger
val command: Command?
}
data class ExistingAutomation(
val id: String,
override val name: String,
override val trigger: AutomationTrigger,
override val command: Command?,
@Json(name = "pending_state") val pendingState: DeviceState? = null,
@Json(name = "provisioning_complete") val provisioningComplete: Boolean? = null,
@Json(name = "provisioning_states") val provisioningStates: List<ProvisioningState>? = null,
) : Automation
Caused by: java.lang.IllegalArgumentException: Cannot serialize object declaration myapp.gatewayapi.data.remote.air.model.TriggerCondition$Always
in my stacktrace?Zac Sweers
08/02/2022, 2:13 PMLukasz Kalnik
08/02/2022, 2:13 PMAlways
MoshiConverterFactory
was not able to cooperate with moshi-sealed
annotated classesZac Sweers
08/02/2022, 2:14 PMLukasz Kalnik
08/02/2022, 2:14 PMZac Sweers
08/02/2022, 2:14 PMLukasz Kalnik
08/02/2022, 2:15 PMZac Sweers
08/02/2022, 2:15 PMLukasz Kalnik
08/02/2022, 2:16 PM