Criei a seguinte entidade e DTO:
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public 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:
@Component
public 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?
brunomouro is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.