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

Conversão de dados

Boa noite, tudo bem?

Eu tenho uma tela na qual os valores (R$) são formatados com Javascript. Logo, quando eu submeto meu formulário, o campo referente ao valor, que é passado no JSON, é do tipo 'string'.

Como eu faço para trabalhar esse valor de forma correta no back-end? Qual abordagem a galera costuma utilizar nesta situação, visto que no back-end, na entidade em questão, este mesmo campo é um BigDecimal?

Peço que me ajudem.

Obrigado!

5 respostas

Bom dia,

Nesse caso não tem muito segredo, a classe BigDecimal tem diversos construtores para muitos tipos de dados diferentes, um deles recebe uma String.

Bastaria fazer new BigDecimal("150.99"); ou:

String valorVindoDoJson = metodoQueObtemValor();
BigDecimal valor = new BigDecimal(valorVindoDoJson);

Abraço.

Boa tarde, Emerson!

Obrigado pela resposta.

Porém, tenho algumas ressalvas. Como o campo é 'string' no front-end, quando eu submeto o formulário, ele já vai conflitar com o tipo da entidade, correto?

Outro ponto é que o campo é formatado no padrão da nossa moeda. Logo, o operador decimal não é um ' . ', como um BigDecimal entende, e sim uma vírgula ' , '.

O fato é que eu preciso tratar a conversão em algum momento. Conheço bibliotecas como a Gson e também a Jackson, que podem fazer esse papel. Gostaria de saber qual a melhor estratégia para de fazer, ou seja, como a galera trabalha essa questão que me parece tão "corriqueira".

solução!

Nesse caso, antes de enviar o form para o backend eu trataria a String para o formato que o BigDecimal entenda, assim não tem alteração no backend.

Boa noite, Lazaro!

Eu optei por fazer a conversão do lado do back-end. A solução que implementei foi criar DTOs.

Por exemplo, para a entidade Produto eu possuo uma classe ProdutoDto, que recebe os campos conforme chegam do JSON e os passa para o construtor da classe/entidade Produto que, por sua vez, está preparado para trabalhar os dados de maneira correta.

Implementação:

public Produto(ProdutoDto produtoDto) {
   this.descricao = produtoDto.getDescricao();
   this.categoria = produtoDto.getCategoria();
   this.codigoPersonalizado = produtoDto.getCodigoPersonalizado();
   this.precoCusto = StringUtil.formataBigDecimal(produtoDto.getPrecoCusto());
   this.precoVenda = StringUtil.formataBigDecimal(produtoDto.getPrecoVenda());
   this.margemLucro = StringUtil.formataBigDecimal(produtoDto.getMargemLucro());
   this.controlarEstoque = produtoDto.getControlarEstoque();
   this.estoqueMinimo = StringUtil.formataBigDecimal(produtoDto.getEstoqueMinimo());
   this.estoqueMaximo = StringUtil.formataBigDecimal(produtoDto.getEstoqueMaximo());
   this.estoqueAtual = StringUtil.formataBigDecimal(produtoDto.getEstoqueAtual());
}

Foi a "melhor" maneira que encontrei até então. Mas, confesso que ainda não me agrada muito.

Obrigado!

Eu tbm não gosto de usar DTO, por isso trato o dado usando o JS e já mando o objeto certinho para popular um entity e não um DTO.

Mas como vc falou, é questão de gosto.

Att