Ошибка десериализации Джексона со значением Kotlin - PullRequest
0 голосов
/ 06 января 2019

Я использую Джексона для десериализации ответов Json от Retrofit.

Для этого я использую библиотеку Jackson Module Kotlin .

У меня есть классы данных со значениями по умолчанию для некоторых значений, которые Java представляет как примитивы, поэтому при обращении к ним без проверки на ноль не произойдет сбой.

Все это прекрасно работает в режиме debug, но когда я запускаю на release с включенным proguard, значения по умолчанию не устанавливаются, и эти значения равны нулю, что вызывает сбой моего приложения при доступе к ним из Java с использованием примитивов.

Я попытался добавить каждое правило защиты, которое смог найти в Интернете, но безуспешно.

Если у кого-нибудь есть идеи, поделитесь.

Спасибо

Пример класса данных

data class RideTask(@JsonProperty(RiderFrontendConsts.PARAM_LOCATION)
                    val location: UserVisibleLocation?,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_TS)
                    val etaTime: Double?,

                    @JsonProperty(RiderFrontendConsts.PARAM_TIME_TO_COMPLETION)
                    val timeToCompletion: Double?,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_DESCRIPTION)
                    val etaDescription: String?,

                    @JsonInclude(JsonInclude.Include.NON_NULL)
                    @JsonProperty(RiderFrontendConsts.PARAM_INTERNAL_ETA_TS)
                    val internalEta: Long? = 0,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_DESCRIPTION_LIST)
                    val etaDescriptionList: List<String>?,

                    @JsonProperty(RiderFrontendConsts.PARAM_DESCRIPTION_PREFIX)
                    val descriptionPrefix: String?,

                    @JsonProperty(RiderFrontendConsts.PARAM_WALKING_DISTANCE_DESCRIPTION)
                    val walkingDistanceDescription: String?,

                    @JsonProperty(RiderFrontendConsts.PARAM_WALKING_DISTANCE_IN_METERS)
                    val walkingDistanceInMeters: Int? = 0)
    : Serializable

Модификация и инициализация Джексона

private Retrofit getRetrofit() {
    LOGGER.debug("prepare retrofit");
    return new Retrofit.Builder()
            .client(getHttpClient(RiderFrontendConsts.DEFAULT_TIMEOUT_IN_MILLIS))
            .baseUrl(SettingsManager.getInstance(Application.getInstance()).getServerBaseUrl())
            .addConverterFactory(JacksonConverterFactory.create(getObjectMapper()))
            .callbackExecutor(Executors.newCachedThreadPool())
            .build();
}

private static ObjectMapper getObjectMapper() {
    LOGGER.debug("prepare object mapper");
    return ExtensionsKt.jacksonObjectMapper()
            .enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
            .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
            .enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            .enable(SerializationFeature.WRITE_ENUMS_USING_INDEX)
            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
            .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY)
            .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
            .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
            .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
}

Соответствующие правила про охрану

#parsers
-keep class com.fasterxml.jackson.annotation.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

# Kotlin
-keep class kotlin.Metadata { *; }
-keepclassmembers public class via.rider.frontend.** {
    public synthetic <methods>;
}

1 Ответ

0 голосов
/ 18 января 2019

Вам необходимо сохранить файлы классов данных (пакет для RideTask - в моем примере предполагается пакет dto, в котором живет RideTask), что-то вроде этого:

-keep,includedescriptorclasses class via.rider.dto.** { *; }

Если это не решит проблему для вас, пожалуйста, опубликуйте logcat с ошибками синтаксического анализа.

...