Moshi JsonAdapter для (desugared) java .time.LocalDate не распознается - PullRequest
3 голосов
/ 18 июня 2020

У меня есть приложение Android, и я пытаюсь перейти с ThreeTenABP на API-интерфейсы Java 8 «time», которые поддерживаются Android Gradle Plugin 4.0, путем удаления сахара

Вот мой собственный адаптер Moshi

@Keep
internal class DateTimeAdapter {
    @ToJson fun toJson(@DateTimeTimestamp dateTime: LocalDateTime): Long {
        return dateTime.toEpochSecond(ZoneOffset.UTC)
    }

    @FromJson @DateTimeTimestamp fun fromJson(dateTimeTimestamp: Long): LocalDateTime {
        return localDateTimeOf(dateTimeTimestamp)
    }
}

@JsonQualifier
@Retention(AnnotationRetention.RUNTIME)
internal annotation class DateTimeTimestamp

Вот как я его использую при создании экземпляра Moshi

   fun provideMoshi(): Moshi {
        return Moshi.Builder()
            .add(DateTimeAdapter())
            .add(KotlinJsonAdapterFactory()).build()
    }

А вот как я использую его в одном из моих DTO

@Keep
data class ErrorDto(
    @Json(name = "timestamp") @DateTimeTimestamp val date: LocalDateTime?,
    @Json(name = "status") val statusCode: Int,
)

Однако во время выполнения я получаю это исключение

java.lang.IllegalArgumentException: Platform class java.time.LocalDateTime requires explicit JsonAdapter to be registered

Тот же самый адаптер отлично работает с org.threeten.bp.LocalDateTime. То есть приложение не обнаруживает sh, а длинная временная метка успешно превращается в LocalDateTime

...