3
respostas

Método POST - rejected value [null]

Pessoal, boa noite!

Seguindo os passos do curso eu to tentando fazer uma API usando um exemplo do mundo real, pois bem, métodos GET tando para listar tudo e por ID funcionam sem problemas, mas o método POST da esse erro aqui:

"timestamp": "2021-10-05T00:33:37.431+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object 'cargo' on field 'id': rejected value [null]; codes [typeMismatch.cargo.id,typeMismatch.id,typeMismatch.long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [cargo.id,id]; arguments []; default message [id]]; default message [Failed to convert value of type 'null' to required type 'long'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [null] to type [long] for value 'null'; nested exception is java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type]\n\tat

O código desse controller e esse aqui:

package br.com.alura.forum2.controller

import br.com.alura.forum2.model.Cargo
import br.com.alura.forum2.service.CargoService
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/cargos")
class CargoController(private val service : CargoService) {

    @GetMapping
    fun listAll() : List<Cargo>{
        return service.listAll()
    }

    @GetMapping("/{id}")
    fun listById(@PathVariable id : Long) : Cargo{
        return service.listById(id)
    }

    @PostMapping
    fun cadastrar(cargo : Cargo){
        service.cadastrar(cargo)
    }
}

Service:

package br.com.alura.forum2.service

import br.com.alura.forum2.model.Cargo
import org.springframework.stereotype.Service
import java.util.*

@Service
class CargoService(var cargos : List<Cargo>) {

    init{
        val cargo1 = Cargo(
            id = 1,
            cargo = "cargo 1"
        )

        val cargo2 = Cargo(
            id = 2,
            cargo = "cargo2"
        )

        cargos = Arrays.asList(cargo1, cargo2)
    }

    fun listAll() : List<Cargo>{
        return cargos
    }

    fun listById(id : Long) : Cargo{
        return cargos.stream().filter({ c -> c.id == id}).findFirst().get()
    }

    fun cadastrar (cargo : Cargo){
        cargos.plus(cargo)
    }
}

O JSON que estou passando no Postman e esse aqui:

{
    "id" : 3,
    "cargo" : "cargo3"
}

Ainda não implementei DTOs e nem os repositories pq quero fazer isso funcionar sem banco.

3 respostas

Oi Douglas,

Posta aqui também a sua classe Cargo.

Rodrigo, boa noite!

Mil desculpas, ia postar e acabei esquecendo! Segue:

package br.com.alura.forum2.model

data class Cargo (
    val id: Long,
    val cargo: String
        )

Oi Douglas,

Acho que o problema está no seu método cadastrar do controller, pois está faltando anotar o parâmetro com @RequestBody:

@PostMapping
fun cadastrar(@RequestBody cargo : Cargo) {
    service.cadastrar(cargo)
}

Veja se assim resolve.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software