SimpleXmlConverterFactory и IllegalArgumentException: невозможно создать конвертер для retrofit2.Call - PullRequest
0 голосов
/ 04 апреля 2019

Недавно у меня была задача обработать ответ в формате xml. Я попытался решить проблему, используя модернизацию и SimpleXmlConverterFactory. Подскажите пожалуйста как решить проблему или какую альтернативу использовать.

class App : Application() {

    lateinit var api : Api

    override fun onCreate() {
        super.onCreate()

        val retrofit = Retrofit.Builder()
                .baseUrl("http://www.nbrb.by/Services/")
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()

        api = retrofit.create(Api::class.java)
    }
    }

    @Root(name="DailyExRates")
    class Сurrency (@ElementList val currencyItems: List<CurrencyItem>)

    @Element(name="Currency")
    class CurrencyItem (@Element(name="NumCode") val numCode: Int,
                        @Element(name="CharCode") val charCode: String,
                        @Element(name="Scale") val scale: Int,
                        @Element(name="Name") val name: String,
                        @Element(name="Rate") val rate: Double)

    interface Api {
        @GET("XmlExRates.aspx?ondate=4.5.2019")
        fun getCurrency() : Observable<Call<Currency>>
    }

    and my dependencies
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'    
    implementation ('com.squareup.retrofit2:converter-simplexml:2.5.0', {
            exclude group: 'xpp3', module: 'xpp3'
            exclude group: 'stax', module: 'stax-api'
            exclude group: 'stax', module: 'stax'
    })

1 Ответ

0 голосов
/ 05 апреля 2019

Вот исправленная версия кода.

@Root(name = "DailyExRates")
class СurrencyModel @JvmOverloads constructor (){

@get:Attribute(name = "Date")
@set:Attribute(name = "Date")
var date: String? = null

@get:ElementList(name="Currency", inline=true)
@set:ElementList(name="Currency", inline=true)
var currencyItems: List<CurrencyItem>? = null
}

@Root(name = "Currency")
class CurrencyItem @JvmOverloads constructor (){

@get:Attribute(name = "Id")
@set:Attribute(name = "Id")
var id: Short? = null

@set:Element(name = "NumCode")
@get:Element(name = "NumCode")
var numCode: Int? = null

@set:Element(name = "CharCode")
@get:Element(name = "CharCode")
var charCode: String? = null

@set:Element(name = "Scale")
@get:Element(name = "Scale")
var scale: Int? = null

@set:Element(name = "Name")
@get:Element(name = "Name")
var name: String? = null

@set:Element(name = "Rate")
@get:Element(name = "Rate")
var rate: Double? = null

}

interface Api {
@GET("XmlExRates.aspx?ondate=4.5.2019")
fun getCurrency() : Observable<СurrencyModel>
}

val retrofit = Retrofit.Builder()
            .baseUrl("http://www.nbrb.by/Services/")
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()

api = retrofit.create(Api::class.java)

val api = (application as App).api
api.getCurrency()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ onLoaded(it) },{ onError(it) })

Мои зависимости остаются прежними.Это может выглядеть странно, но это работает.Ссылка, откуда я получаю информацию: http://www.nbrb.by/Services/XmlExRates.aspx?ondate=4.5.2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...