Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] método do retrofit (listByInventory) não retorna nenhum resultado

Bom dia a todos Eu segui todos os passos do método do get pelo retro fit com esse link:

http://localhost:8080/cars/lista-modelo?modelo=gol

E mesmo tendo retorno de código 200, não me retornou nada neste método Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas se for comparar com outras requisições get meus, ele tem esse retorno:

[{"id":1,"name":"Golf","model":"VW","year":2018,"isEligible":false},{"id":2,"name":"Uno","model":"VW","year":2018,"isEligible":true}] //eu criei esse objeto uno para ver se o erro era no outro objeto

Eu não sei porque tem essa diferença de resultado, e pior, como nem o postman e nem o Intellij apontam um erro ou exceção, nem sei por onde começar. Vou colocar o código de vários métodos para ver se encontro o erro:

@RestController
@RequestMapping("/cars")
class CarResource(
    private val carService: CarService
) {

//codigo omitido por ser copiado do projeto original e estar funcionando

    @GetMapping("/lista-modelo")
    fun listByInventory(@RequestParam modelo: String)  =
        carService.listByInventory(modelo)
}
@Configuration
class CarHttpConfiguration {
    private companion object{
        const val BASE_URL = "http://localhost:8080/"
    }
    private fun buildClient() = OkHttpClient.Builder().build()
    private fun buildRetroFit() = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(buildClient())
        .build()
    @Bean
    fun carHttpService(): CarHttpService = buildRetroFit().create(CarHttpService::class.java)
}
@Service
interface CarHttpService {
    @GET("cars-inventory")
    fun getByModel(@Query("model") model: String): Call<List<CarHttp>>
}
object CarHttpToModelConverter {
    fun toModel(carsHttp: List<CarHttp>) = carsHttp.map {
        carHttp -> Car(
            id = Long.MAX_VALUE,
            name = carHttp.model,
            model = carHttp.make,
            year = carHttp.year
        ).isEligibleToUber()
    }
}
@Service
internal class CarService(
    private val carRepository: CarRepository,
    private val carHttpService: CarHttpService
) : CarService {

//codigo omitido por ser copiado do projeto original e estar funcionando

    override fun listByInventory(model: String) =
        carHttpService.getByModel(model)
            .execute()
            .body()?.let(CarHttpToModelConverter::toModel)
}
data class CarHttp (
    val make: String,
    val model: String,
    val year: Long
){
interface CarService {
//codigo omitido por ser copiado do projeto original e estar funcionando
    fun listByInventory(modelo:String): List<Car>?
}
2 respostas
solução!

Olá, Murilo!

Pelo que entendi, você está enfrentando um problema com o método do Retrofit listByInventory, que não está retornando nenhum resultado, mesmo com o código de retorno 200. Além disso, você mencionou que nem o Postman nem o IntelliJ estão apontando erros ou exceções.

Pelo código que você compartilhou, parece que você está usando o Retrofit para fazer uma requisição GET para a URL http://localhost:8080/cars/lista-modelo?modelo=gol. No entanto, mesmo com o código 200, você não está recebendo nenhum resultado.

Uma possível causa para esse problema pode ser a implementação do método listByInventory no serviço CarService. Nesse método, você está chamando o método getByModel do carHttpService, que é a interface que o Retrofit implementa para fazer a requisição HTTP.

Após a chamada do getByModel, você está executando a requisição com o método execute() e obtendo o corpo da resposta com o método body(). Em seguida, você está usando o let para converter a resposta do tipo List<CarHttp> para List<Car> usando o CarHttpToModelConverter.

No entanto, não consigo ver nenhum problema óbvio no código que você compartilhou. Seria interessante verificar se a requisição está sendo feita corretamente e se o servidor está retornando os dados esperados. Você pode verificar isso usando ferramentas como o Postman ou fazendo um log da resposta no código.

Além disso, você pode verificar se o problema está na implementação do CarHttpToModelConverter, certificando-se de que os campos make, model e year estão sendo mapeados corretamente para os campos correspondentes do objeto Car.

Se você puder fornecer mais informações ou detalhes sobre o problema, posso tentar ajudar de forma mais específica. Espero ter ajudado e bons estudos!

Me desculpa, eu mexi nesse projeto faz quase 3 meses, já fiz milhares de outros cursos e não me lembro se eu já tinha resolvido isso ou não, mas agradeço a ajuda