Omit DTO attribute (Spring Data JPA)

1
Hello, I have two classes DTO (CategoryDTO and ProductDTO) in a restfull application, how can I omit a particular attribute of the ProductDTO when it is used in the CategoryDTO class? Below are the classes, the return on the Postman, and what I'm trying to accomplish. Thankful.

CategoryDTO

package com.eclodir.voucomprei.dto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.eclodir.voucomprei.domain.Categoria;

public class CategoriaDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String descricao;
    private String foto;
    private List<ProdutoDTO> produtos = new ArrayList<>();

    public CategoriaDTO() {}
    public CategoriaDTO(Categoria obj) {
        this.id = obj.getId();
        this.descricao = obj.getDescricao();
        this.foto = obj.getFoto();
        this.produtos = obj.getProdutos().stream().map(x -> new ProdutoDTO(x)).collect(Collectors.toList());
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public String getFoto() {
        return foto;
    }
    public void setFoto(String foto) {
        this.foto = foto;
    }
    public List<ProdutoDTO> getProdutos() {
        return produtos;
    }
    public void setProdutos(List<ProdutoDTO> produtos) {
        this.produtos = produtos;
    }

}

ProductDTO

package com.eclodir.voucomprei.dto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.eclodir.voucomprei.domain.Categoria;
import com.eclodir.voucomprei.domain.Produto;

public class ProdutoDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String descricao;
    private String foto;
    private String fabricante;
    private String unidade;
    private List<String> categorias = new ArrayList<>(); // Esta lista recebe as descrições das categorias

    public ProdutoDTO() {
    }

    public ProdutoDTO(Produto obj) {
        super();
        this.id = obj.getId();
        this.descricao = obj.getDescricao();
        this.foto = obj.getFoto();
        this.fabricante = obj.getFabricante();
        this.unidade = obj.getUnd().getDescricao();

        // Recebendo as descriçoes das categorias
        for (Categoria x : obj.getCategorias()) {
            if (x != null) {
                categorias.add(x.getDescricao());
            }
        }

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public String getFabricante() {
        return fabricante;
    }

    public void setFabricante(String fabricante) {
        this.fabricante = fabricante;
    }

    public String getUnidade() {
        return unidade;
    }

    public void setUnidade(String unidade) {
        this.unidade = unidade;
    }

    public List<String> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<String> categorias) {
        this.categorias = categorias;
    }

}

Return on category listing endpoint:

As you can see, in the return of the entpoint each category shows its list of products, however, each product brings the categories that it is part of, this because the ProductDTO contains this attribute that is important in other processes. Is there any way to omit the categories within the product breakdown? I look for an alternative other than creating another DTO without this attribute to be used.

    
asked by anonymous 23.03.2018 / 14:12

1 answer

0

There is an annotation called @JsonIgnore queser recognized by Jackson, which is the default library used by Spring for Json conversions. Jackson will identify that you do not want to serialize this field. In your case, your entity would look something like this:

public class Produto {

   @JsonIgnore
   private List<Categoria> categorias;   

//...

If I misunderstand your question or if you need more, leave a comment that I change the answer to help you more.

    
23.03.2018 / 15:48