java.lang.ClassCastException при использовании requestBody для данных формы в Retrofit - PullRequest
0 голосов
/ 07 мая 2019

У меня есть простая задача, используемая для вызова API Rest с помощью дооснащения для входа в систему. Работает хорошо:

class SignInTask constructor(
        private val apiService: ApiService,
        private val signIn: SignIn,
        private val db: Db
) : Runnable {
    private val _liveData = MutableLiveData<Resource<SignResponse>>()
    val liveData: LiveData<Resource<SignResponse>> = _liveData

    override fun run() {

            val newValue = try {
            val response = apiService.signIn(signIn).execute()
            val apiResponse = ApiResponse.create(response)

            when (apiResponse) {
                is ApiSuccessResponse -> {
                    _liveData.postValue(Resource.success(apiResponse.body))
                }
                is ApiEmptyResponse -> {
                    Resource.success(false)
                }
                is ApiErrorResponse -> {
                    Resource.error(apiResponse.errorMessage, true)
                }
            }
        } catch (e: IOException) {
            Resource.error(e.message!!, true)
        }
        _liveData.postValue(newValue as Resource<SignResponse>?)
    }
}

соответствующая услуга переоборудования API:

@POST("/v1/signin/")
fun signIn(@Body signIn: SignIn): Call<SignResponse>

Мне нужноизмените это на form-data, так как бэкэнд был изменен и запрашивает его.Поэтому я добавил requestBody

class SignInTask constructor(
        private val apiService: ApiService,
        private val signIn: SignIn,
        private val db: FastcountDb
) : Runnable {
    private val _liveData = MutableLiveData<Resource<SignResponse>>()
    val liveData: LiveData<Resource<SignResponse>> = _liveData

    override fun run() {

        val requestBody = MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("email", signIn.email)
                .addFormDataPart("password", signIn.password)
                .addFormDataPart("tenant", signIn.tenant.toString())
                .build()

        val newValue = try {

            val response = apiService.signIn(requestBody).execute()
            val apiResponse = ApiResponse.create(response)

            when (apiResponse) {
                is ApiSuccessResponse -> {
                    _liveData.postValue(Resource.success(apiResponse.body))
                }
                is ApiEmptyResponse -> {
                    Resource.success(false)
                }
                is ApiErrorResponse -> {
                    Resource.error(apiResponse.errorMessage, true)
                }
            }
        } catch (e: IOException) {
            Resource.error(e.message!!, true)
        }
        _liveData.postValue(newValue as Resource<SignResponse>?)
    }
}

Служба модификации API:

@POST("/v1/signin/")
fun signIn(@Body body: RequestBody): Call<SignResponse>

Единственное изменение создано и добавлен requestBody.Проблема в том, что теперь приложение падает на линии

_liveData.postValue(newValue as Resource<SignResponse>?)

с

java.lang.ClassCastException: kotlin.Unit cannot be cast to at.ivii.fastcount.vo.Resource
        at at.ivii.fastcount.repository.task.SignInTask.run(SignInTask.kt:52)

Во время отладки я вижу, что вызов API успешно завершен с 200 и правильным ответом, но это просто сбой.

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