Criei a seguinte entidade e DTO:
@Entity@AllArgsConstructor@NoArgsConstructor@Datapublic class Lancamento {@Id@GeneratedValue(strategy = GenerationType.AUTO)private long id;@NotBlank@NotNull@Column(length = 10)private String data;@Positive@Column(nullable = false, columnDefinition = "DECIMAL(10, 2)")private double valor;@NotBlank@NotNull @Column(length = 100)private String descricao;@ManyToOne@JoinColumn(name = "categoria_id")private Categoria categoria;@ManyToOne@JoinColumn(name = "cartao_id")private Cartao cartao;}
`public record LancamentoDTO( @Id Long id, @NotBlank @NotNull String data, @NotBlank @NotNull String descricao, @Positive double valor, CategoriaDTO categoria, CartaoDTO cartao) {}`
Essa é a classe de serviço que chama o método save() do repostório:
@Service public class LancamentoService { private final LancamentoRepository lancamentoRepository; private final LancamentoMapper mapper; public LancamentoService(LancamentoRepository lancamentoRepository, LancamentoMapper mapper) { this.lancamentoRepository = lancamentoRepository; this.mapper = mapper; } public LancamentoDTO incluirLancamento(LancamentoDTO lancamento) { return mapper.toDTO(lancamentoRepository.save(mapper.toEntity(lancamento))); }
O mapper foi construído da seguinte forma:
@Componentpublic class LancamentoMapper { public LancamentoDTO toDTO(Lancamento lancamento) { if (lancamento == null) { return null; } return new LancamentoDTO(lancamento.getId(), lancamento.getData(), lancamento.getDescricao(), lancamento.getValor(), CategoriaMapper.toDTO(lancamento.getCategoria()), CartaoMapper.toDTO(lancamento.getCartao())); } public Lancamento toEntity(LancamentoDTO lancamentoDTO) { if (lancamentoDTO == null) { return null; } Lancamento lancamento = new Lancamento(); if (lancamentoDTO.id() != null) { lancamento.setId(lancamentoDTO.id()); } lancamento.setData(lancamentoDTO.data()); lancamento.setDescricao(lancamentoDTO.descricao()); lancamento.setValor(lancamentoDTO.valor()); lancamento.setCategoria(CategoriaMapper.toEntity(lancamentoDTO.categoria())); lancamento.setCartao(CartaoMapper.toEntity(lancamentoDTO.cartao())); return lancamento; }}
Uso o seguinte JSON para requisição:
{"data": "19/07/2024","valor": "150","descricao": "Abastecimento","categoria": {"type": "despesa","id": "1"},"cartao": { "id": "1" }}
Antes de enviar a requisição para criar um novo lançamento, eu crio uma nova categoria e um novo cartão e os associo a requisição. No entanto, no JSON de retorno, as classes de composição (categoria e cartão) são retornadas nulas:
{"id": 2,"data": "19/07/2024","descricao": "Abastecimento","valor": 150.0,"categoria": {"type": "despesa","id": 1,"nome": null,"meta": 0.0 },"cartao": {"id": 1,"nome": null }}
Como poderia fazer para que as classes de composição retornassem com dados?