4
respostas

Inserindo Array json.

Estou criando uma aplicação REST com Spring Boot 2 (sei que aqui não é de Spring, porem é de REST) e me fiquei preso no seguinte cenário:

Tenho 2 classes no meu Domain, que tem além de alguns métodos e atributos os seguintes:

@Entity
class Telefone
private String numeroDeTelefone;
@JsonBackReference
@ManyToMany(mappedBy = "telefones")
private List<PessoaFisica> pessoasFisicas = new ArrayList<>();

e uma classe PessoaFisica:

@Entity
class PessoaFisica extends Cliente
@JsonManagedReference
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "pessoafisica_telefone", joinColumns = @JoinColumn(name = "fk_pessoafisica"),inverseJoinColumns = @JoinColumn(name = "pk_telefone"))
private List<Telefone> telefones = new ArrayList<>();

com isso tenho um relacionamento de muitos para muitos entre PessoaFisica e Telefone. Sei que não é a modelagem correta, é somente para aprender como trabalhar com muitos para muitos.

Criei uma PessoaFisicaDTO, para ter os atributos de cliente e telefone.

E no PessoaFisicaService fiz o seguinte método;



public PessoaFisica recebeDTO(PessoaFisicaDTO pessoaFisicaDTO){

Cliente cliente = new PessoaFisica(parâmetros do construtor);

Telefone telefone = new Telefone(parâmetros do construtor);

telefone.getPessoaFisica().addAll(Arrays.asList(cliente));
((PessoaFisica)cliente).getTelefones().addAll(Arrays.asList(telefone));
}

Dessa forma eu consigo inserir no banco um cliente com um telefone. Mas o que eu gostaria era inserir um cliente com N telefones. Criar um array de telefones e inseri-los. Já tentei um foreach mas sem sucesso. Qual seria a maneira correta de fazer isso?

4 respostas

Me parece correto seu codigo. Que erro da quando voce tenta inserir os varios telefones?

Olá Paulo, tudo bom?

Entao, irei detalhar mais o caso.

No PessoaFisicaDTO eu tenho os seguintes atributos:

private String nome;
private String cpf;
private String email;

**demais atributos **

private String numeroDeTelefone;

private List<Telefone> telefones = new ArrayList<>();

public PessoaFisicaDTO() {
}

public void adicionaTelefone(String numeroDeTelefone) {
   telefones.add(new Telefone(numeroDeTelefone);
}

Meu service ficou assim:

mantive:

Cliente cliente = new PessoaFisica(parâmetros do construtor);

retirei:


Telefone telefone = new Telefone(parâmetros do construtor);

e adicionei:


foreach (Telefone x : cliente.getTelefones()) {
pessoaFisicaDTO.adicionaTelefones(pessoaFisicaDTO.getNumeroDeTelefone()); 

x.getPessoaFisica().addAll(Arrays.asList(cliente));
((PessoaFisica)cliente).getTelefones().addAll(Arrays.asList(x));

Dessa maneira ocorrem dois erros:

1 - Caso o meu List da PessoFisicaDTO, não tenha a anotação @JsonIgnore, dará erro de serialização, e no Postman erro 415 Unsupported Media Type.

2 - Caso eu coloque a anotacao @JsonIgnore, no List do PessoaFisicaDTO, o erro 415 não acontece mais, porem nenhum telefone é adicionado, e caso eu de um GET no cliente pessoa física que acabei de adicionar o "telefones" virá um array vazio.

Segue meu Post:

{
  "nome" : "Rodrigoxxxxx",
  "cpf" : "xxxxxx",
  "rg" : "xxxxx",
  "email" : "rodrigoxxx@hotmail.com",
  "dataDeNascimento" : "16/xx/19xx",
  "naturalidade" : "Goiania",
  "profissao" : "Desenvolvedor",
  "genero" : 2,
  "estadoCivil" : 2,
  "pessoaFisicaTipo" : 1,
  "telefones" : 
  [
   {"numeroDeTelefone" : "2222222"},
   {"numeroDeTelefone" : "33333333"}
  ],
  "nomeDoBairro" : "Jardim Novo Horizonte",
  "logradouro" : "Asturio Martins",
  "numeroLogradouro" : "1955C",
  "complemento" : "S/C",
  "cep" : "79822-310",
  "tipoDeEndereco" : 2,
  "cidadeId" : 1518
}

Segue meu GET:

{
    "id": 1,
    "nome": "Rodrigoxxxxx",
    "cpf": "xxxxxx",
    "rg": "xxxxx",
    "email": "rodrigoxxxxx@hotmail.com",
    "dataDeNascimento": "16/xx/19xx",
    "naturalidade": "Goiania",
    "profissao": "Desenvolvedor",
    "genero": "Masculino",
    "estadoCivil": "Divorciado",
    "pessoaFisicaTipo": "Cliente",
    "bairros": [
        {
            "id": 1,
            "nomeDoBairro": "Jardim Novo Horizonte",
            "logradouro": "Asturio Martins",
            "numero": "1955C",
            "complemento": "S/C",
            "cep": "79822-310",
            "tipoDeEndereco": "Residencial",
            "cidade": null
        }
    ],
    "telefones": []
}

ps: o cidade vem null pois não subi o BD com as cidades e estados do país. Mas isso não interfere em nada. =)

O que pode ser? Agradeço a atenção.

Opa, parece que você já recebe o json através de um objeto do tipo PessoaFisicaDTO, é isso? Se for, realmente o jackson não gosta quando você não passa as propriedades. O mal de colocar o @JsonIgnore é que você a ter que fazer tratamento sobre os dados do seu objeto. Você adicionou os getters e setters para todos os atributos do dto? Inclusive para a lista?

Eu gerei seu dto a partir desse site => http://pojo.sodhanalibrary.com/

Ele gerou tudo string, mas de toda forma, sua classe cujo objeto é criado a partir do json, deveria ser parecida com essa

public class PessoaFisicaDTO
{
    private String dataDeNascimento;

    private String complemento;

    private String estadoCivil;

    private Telefone[] telefones;

    private String naturalidade;

    private String rg;

    private String tipoDeEndereco;

    private String genero;

    private String cep;

    private String pessoaFisicaTipo;

    private String email;

    private String nomeDoBairro;

    private String numeroLogradouro;

    private String logradouro;

    private String nome;

    private String cpf;

    private String profissao;

    private String cidadeId;

    public String getDataDeNascimento ()
    {
        return dataDeNascimento;
    }

    public void setDataDeNascimento (String dataDeNascimento)
    {
        this.dataDeNascimento = dataDeNascimento;
    }

    public String getComplemento ()
    {
        return complemento;
    }

    public void setComplemento (String complemento)
    {
        this.complemento = complemento;
    }

    public String getEstadoCivil ()
    {
        return estadoCivil;
    }

    public void setEstadoCivil (String estadoCivil)
    {
        this.estadoCivil = estadoCivil;
    }

    public Telefones[] getTelefones ()
    {
        return telefones;
    }

    public void setTelefones (Telefones[] telefones)
    {
        this.telefones = telefones;
    }

    public String getNaturalidade ()
    {
        return naturalidade;
    }

    public void setNaturalidade (String naturalidade)
    {
        this.naturalidade = naturalidade;
    }

    public String getRg ()
    {
        return rg;
    }

    public void setRg (String rg)
    {
        this.rg = rg;
    }

    public String getTipoDeEndereco ()
    {
        return tipoDeEndereco;
    }

    public void setTipoDeEndereco (String tipoDeEndereco)
    {
        this.tipoDeEndereco = tipoDeEndereco;
    }

    public String getGenero ()
    {
        return genero;
    }

    public void setGenero (String genero)
    {
        this.genero = genero;
    }

    public String getCep ()
    {
        return cep;
    }

    public void setCep (String cep)
    {
        this.cep = cep;
    }

    public String getPessoaFisicaTipo ()
    {
        return pessoaFisicaTipo;
    }

    public void setPessoaFisicaTipo (String pessoaFisicaTipo)
    {
        this.pessoaFisicaTipo = pessoaFisicaTipo;
    }

    public String getEmail ()
    {
        return email;
    }

    public void setEmail (String email)
    {
        this.email = email;
    }

    public String getNomeDoBairro ()
    {
        return nomeDoBairro;
    }

    public void setNomeDoBairro (String nomeDoBairro)
    {
        this.nomeDoBairro = nomeDoBairro;
    }

    public String getNumeroLogradouro ()
    {
        return numeroLogradouro;
    }

    public void setNumeroLogradouro (String numeroLogradouro)
    {
        this.numeroLogradouro = numeroLogradouro;
    }

    public String getLogradouro ()
    {
        return logradouro;
    }

    public void setLogradouro (String logradouro)
    {
        this.logradouro = logradouro;
    }

    public String getNome ()
    {
        return nome;
    }

    public void setNome (String nome)
    {
        this.nome = nome;
    }

    public String getCpf ()
    {
        return cpf;
    }

    public void setCpf (String cpf)
    {
        this.cpf = cpf;
    }

    public String getProfissao ()
    {
        return profissao;
    }

    public void setProfissao (String profissao)
    {
        this.profissao = profissao;
    }

    public String getCidadeId ()
    {
        return cidadeId;
    }

    public void setCidadeId (String cidadeId)
    {
        this.cidadeId = cidadeId;
    }

}

No lugar de um array ali, você poderia ter a lista. E aí basta que você pegue essas informações e crie seus objetos de dominio.

Uma outra coisa... Eu não misturaria as annotations do jackson na sua entidade... Várias vezes o json não vem exatamente igual a entidade e a gente acaba com um mix de annotatins estranho.

Acho que compreendi o problema porem não sei como resolvê-lo. tenho que usar alguma biblioteca para serializar e deserializar o JSON. Ou com GJSON, JACKSON, etc. Como o spring adota o jackson como padrao, gostaria de ser com ele. Porem não sei usá-lo. Estou lendo mas não compreendi direito. Visto meu "projeto" com entitys, dtos e service, poderia me ajudar? Tenho que informar que o List< Telefone> ou o Telefone[] tem informações que serão convertidas em um json array.