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

Adicionar mais de um carro via JSON

Pessoal, preciso criar um método que receba um ou mais carros e cadastrar no banco pelo Spring DATA. Consigo fazer isto normalmente quando insiro um carro de cada vez, mas preciso criar um método que insira mais de um. fiz algo parecido.

Entity
@Entity
public class Clarro { 

    @Id
    private Long idCarro;

    public String cor;

    public String nome;

//Getters e Setters
}
Serviço
@RestController
@RequestMapping("webservice")
public class ExposedEndPointsForIntegration {

@Autowired
    private CarroService clienteService;

@PostMapping(path = "carro/cadastrar", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},
    consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_ATOM_XML_VALUE})
    public void cadastraCarros(@RequestBody List<Carro> carro) {
        clienteService.insertCarro(carro);
    }
}

O JSon enviado no Postman é:

{
   "Cliente":[
      {
         "idCarro":"123",
         "cor" : "azul"
        "nome" : "FUSCA"
      },
      {
          "idCarro":"456",
         "cor" : "branco"
        "nome" : "BRASILIA"
      }
   ]
}

O erro é este

"JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token\n at [Source: (PushbackInputStream); line: 1, column: 1]",

Alguém pode me dizer o que seria? Parece algo muito simples, né?

2 respostas

O problema é o seu JSON. Não dá para desserializar um Objeto em uma coleção porque não é realmente uma matriz JSON.

Seu Json deveria ser algo assim:

[
      {
         "idCarro":"123",
         "cor" : "azul"
         "nome" : "FUSCA"
      },
      {
          "idCarro":"456",
         "cor" : "branco"
        "nome" : "BRASILIA"
      }
]
solução!

Fala aí, Otávio! Vamos lá. Eu resolvi, mas acabei esquecendo de publicar aqui. A solução é bem simples, na verdade meu JSON, como você bem disse, precisava deixar claro que era um array. Resolvi apenas fazendo a seguinte correção:

{
   "carros":[
      {
         "idCarro":"123",
         "cor":"branco",
         "nome":"PALIO",
      },
      {
         "idCarro":"456",
         "cor":"vermelho",
         "nome":"GOLF",
      }
   ]
}

Dai usei um pattern chamado Wrapper para a classe Carro. Fiz uma classe WrapperCarro que nela só tem um List

Consegui o resultado esperado no Postman e no MySQL diz mostra lá o resultado.

Valeu pelo apoio!