Есть ли аннотация, которую можно игнорировать при изменении типа ответа в fastxml? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть приложение для Android (написанное Kotlin).

Оно использует внешний сервер, а сервер предоставляет XML в качестве ответа.

На прошлой неделе ответ сервера был изменен.В ответ был добавлен новый элемент.

Итак, мое приложение зависло ...

Чтобы решить эту проблему, я добавил аннотацию:

@JsonIgnoreProperties(ignoreUnknown = true)

И все работает нормально.

Но у меня есть вопрос.Если сервер меняет тип данных ответа, как я могу его обработать?Например, вот ответ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <data>
        <sessionid>hello</sessionid>
        <endpoint>https://test.com</endpoint>
        <id>123</id>
        <pw>testpassword</pw>
    </data>
</response>

Теперь, если тип элемента "pw" изменяется на "Integer", как показано ниже, возникает исключение.

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <data>
        <sessionid>hello</sessionid>
        <endpoint>https://test.com</endpoint>
        <id>123</id>
        <pw>0000</pw>    <!-- server response type is changed from String to Integer -->
    </data>
</response>
Cannot deserialize value of type `java.lang.Integer` from String "pw": not a valid Integer value

И мое приложение будет аварийно завершено.

Я хочу предотвратить сбои такого рода изменений.Есть ли хорошее решение?или аннотации типа «@JsonIgnoreProperties»?


Я думаю, что тип «Любой» может быть решением.Но это последнее решение ... Я хочу найти более разумное решение.

1 Ответ

1 голос
/ 29 мая 2019

Да, вы можете использовать пользовательский установщик для переменной pw, который приводит типы:

class ResponseData(pw: String) {
    var pw: String
        set(value: Any) {
            field = when(value) {
                is String -> value
                else -> value.toString()
            }
        }
}

Примечание: это все равно будет выдавать исключения, если тип не может быть приведен к строкечерез метод toString.

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

data class C(private val _propertyWithSetter: String) {
    val propertyWithSetter: String
        get() = _propertyWithSetter
        set(value) {
            /* execute setter logic */
            _propertyWithSetter = value
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...