개발/Android Studio 에러

에러: Field 'username' is required for type with serial name 'com.example.data.model.UserDTO', but it was missing at path: $.data at path: $.data

스몰스테핑 2024. 8. 13. 19:43

 

로그인 이후, 내 정보를 보는 Activity에 접근했을 때 자동으로 내 username을 띄우게 진행하였다.

이때 username을 불러오는데 실패하며 발생한 오류이다.

 

https://stackoverflow.com/questions/64796913/kotlinx-serialization-missingfieldexception

 

Kotlinx Serialization MissingFieldException

I am in the process of converting from Moshi to kotlinx serialization with Ktor and when I try to make a request to get data I am getting this error kotlinx.serialization.MissingFieldException: Fi...

stackoverflow.com

 

검색을 해보면 DTO쪽 문제인 것 같다.

 

import com.example.domain.model.User
import kotlinx.serialization.Serializable

@Serializable
data class UserDTO (
    val id: Long,
    val loginId: String,
    val username: String,
    val extraUserInfo: String,
    val profileFilePath: String
)

fun UserDTO.toDomainModel(): User {
    return User(
        id = this.id,
        loginId = this.loginId,
        username = this.username,
        profileImageUrl = this.profileFilePath
    )
}

 

  • 만약 네트워크 통신, API를 통해 데이터를 @POST 하거나 @GET 해오는데 @Serializable가 없다면 추가해야한다.
  • 추가했는데도 문제가 있다면 필자처럼 DTO에서 잘못 썼을 수도 있다.

 

 

SettingViewModel에서 오류를 발생시키는 곳에서 사용하는 DTO는 다음과 같다.

Retrofit 통신을 통해 Spring Boot 웹서버의 Swagger UI API에서 받아올때 사용하는 녀석이다.

 

 

위 DTO와 Swagger UI API의 내 정보 조회 Response body를 비교해보자.

기존에 username으로 작성되어있으나, Response Body에서는 userName으로 작성되어 있는 것을 확인할 수 있다.

 

import com.example.domain.model.User
import kotlinx.serialization.Serializable

@Serializable
data class UserDTO (
    val id: Long,
    val loginId: String,
    val userName: String,
    val extraUserInfo: String,
    val profileFilePath: String
)

fun UserDTO.toDomainModel(): User {
    return User(
        id = this.id,
        loginId = this.loginId,
        username = this.userName,
        profileImageUrl = this.profileFilePath
    )
}

 

 

문제되는 부분만 수정하면 정상적으로 Profile Image 밑에 UserName을 띄우고 있는 것을 확인할 수 있다.