Omit DTO (Spring Data JPA) attribute

Asked

Viewed 685 times

1

Hello, I have two DTO classes (Categoriadto and Productodto) in a restfull application, how can I omit a certain attribute of Productodto when it is used in the Categoriadto class? Below follow the classes, the return in the Postman, and what I am wanting to accomplish. Grateful.

Categoriadto

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;
    }

}

Product

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 to the category listing endpoint: inserir a descrição da imagem aqui

As you can see, in the return of entpoint each category shows its list of products, however, each product brings the categories that this is part of, This because the Productit contains this attribute that is important in other processes. Is there any way to omit the categories within the product detail? I am looking for an alternative that is not to create another DTO without this attribute to be used.

1 answer

0


There is a Annotation calling for @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 have misunderstood your question or if you need anything else, leave a comment and I will change the answer to help you more.

  • Hi, all right? Is there any way Jsonignore can be selective? For example, within an endpoint that returns a list the attribute is ignored, already in an endpoint that returns the object itself the attribute is displayed.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.