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

Erro ao passar valores para BigDecimal

Estou recebendo um erro ao fazer POST para um aplicação rest no Spring Boot 2.2.9.

2020-08-06 15:30:11.994  WARN 213101 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('5' (code 53)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('5' (code 53)): was expecting double-quote to start field name

Quero receber um valor em um campo BigDecimal no spring, método que recebe o JSON:

    @PostMapping
    public ResponseEntity<TopicoDTO> cadastrar(@RequestBody TopicoForm form, UriComponentsBuilder uriBuilder) {

        Topico topico = form.converter(topicoRepositorio);
        topicoRepositorio.save(topico);
        URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
        return ResponseEntity.created(uri).body(new TopicoDTO(topico));
    }

String e int funciona, mas eu quero ver o funcionamento com BigDecimal.

link do projeto do curso: https://caelum-online-public.s3.amazonaws.com/1236-api-com-spring-boot/04/1236-springapi-aula4.zip

Vi em um forum isso:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

Tenho que converter os dados quem vem do JSON?

2 respostas

Olá Matias, tudo bem?

Realmente, algumas propriedades que estamos trabalhando, as vezes, pedem que a gente crie um ObjectMapper para fazer a conversão

Entretanto, com BigDecimal não é necessário, ele consegue transformar o nosso request no campo automaticamente, eu criei até um projeto bem simples para testar, pois achei muito estranho hahahahaa

Mas olhando o log de erro, me parece que a requisição que você fez está com formato errado, você poderia tirar um print, ou postar como ela foi feita?

Ao que parece ao tentar fazer o parse dos dados, como estava em um formato errado, houve esse problema

Quando precisamos converter, a mensagem de erro normalmente vai falar algo parecido como No DefaultMapper found for java.time.LocalDateTime, por exemplo

Fico no Aguardo =D

Abraços e Bons Estudos!

solução!

Entendi, Geovani. Eu fiz o seguinte;

Na classe TopicoForm que recebe os dados eu coloquei o BigDecimal como String e depois converti para Topico criando um objeto BigDecimal. ex:

BigDecimal valor = new BigDecimal(valor);

Isso funcionou, mas achei estranho o Spring não fazer esse 'parse' sozinho. Eu passei os dados corretos, "valor" : 1.5 no JSON.