Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao salvar lista

Possuo uma lista de itens dentro da entidade nota onde ficam alguns produtos. Ao tentar realizar meu primeiro teste inserindo a minha lista de itens os meus produtos tenho recebido a seguinte exceção:

{
    "timestamp": "2023-06-21T19:18:40.647+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `br.com.projetonotafiscal.notafiscal.Entity.Produto` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `br.com.projetonotafiscal.notafiscal.Entity.Produto` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1')\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 19]

Percebi que o problema esta na entidade produto. O Json que estou enviando esta da seguinte forma:

{
    "cliente": 1,
      "itens":[
        {
                      "produto": 1,
            "quantidade": 2
        },
        {
                        "produto": 2,
            "quantidade": 1
        },
        {
            "produto": 3,
            "quantidade": 2
        }
    ],
    "data": "2023-06-21"
}

Aqui esta a minha classe Produto:

@Entity(name = "Produto")
@Table(name = "produto")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String codigo;
    private String descricao;
    private BigDecimal valor_unitario;

    public Produto() {}

    public Produto(ProdutoDTO dto) {
        this.id = dto.getId();
        this.codigo = dto.getCodigo();
        this.descricao = dto.getDescricao();
        this.valor_unitario = dto.getValor_unitario();
    }
    
    //getters e setters

Minha classe Item:

@Entity(name = "Itens")
@Table(name = "itens")
public class Itens {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_produto")
    private Produto produto;

    @ManyToMany(mappedBy = "itens")
    private List<Nota> notas;
    private int ordenacao;
    private BigDecimal quantidade;
    private BigDecimal valor_total;


    public Itens() {}

    public Itens(ItensDTO dto) {
        this.ordenacao = dto.getOrdenacao();
        //this.produto = dto.getProduto();
        this.quantidade = dto.getQuantidade();
        this.valor_total = dto.getValor_total();
    }
    
    //getters e setters

Minha classe Nota:

@Entity(name = "Nota")
@Table(name = "nota")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Nota {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;

    @ManyToMany
    @JoinTable(name = "notas_itens",
            joinColumns = @JoinColumn(name = "id_nota"),
            inverseJoinColumns = @JoinColumn(name = "id_item"))
    private List<Itens> itens;

    private String numero;
    private LocalDate data;
    private BigDecimal valor_total;


    public Nota(NotaDTO dto) {
        this.id = dto.getId();
        //this.cliente = dto.getCliente();
        this.itens = dto.getItens();
        this.data = dto.getData();
        this.valor_total = dto.getValor_total();
        this.numero = dto.getNumero();
    }
    
    //getters e setters
1 resposta
solução!

Olá Natali, tudo bem?

Pelo erro apresentado, parece que o problema está na classe Produto, mais especificamente na falta de um construtor que receba um argumento String. Isso pode estar acontecendo porque o Jackson, que é a biblioteca que faz a conversão do JSON para objeto, está tentando criar uma instância de Produto a partir de um valor String, mas não encontra um construtor que receba esse tipo de argumento.

Uma solução para esse problema seria adicionar um construtor em Produto que receba um argumento String e faça a conversão para o tipo correto. Por exemplo:

public Produto(String id) {
    this.id = Long.parseLong(id);
}

Dessa forma, o Jackson conseguirá criar uma instância de Produto a partir do valor String "1".

Espero ter ajudado e bons estudos!