4
respostas

Converter um JSON diretamente em um objeto

Boa noite gostaria de realizar os mesmos exercícios do curso, só que utilizando jaxb com json.

Testei com o método get, por ser teoricamente mais simples, porém não funcionou.

método no carrinhoresource

@Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Carrinho busca(@PathParam("id") Long id){
        Carrinho carrinho = new CarrinhoDAO().busca(id);
        return carrinho;
    }

Classe carrinho com as anotations do jaxb

package br.com.alura.loja.modelo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import com.thoughtworks.xstream.XStream;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Carrinho {

    private List<Produto> produtos = new ArrayList<Produto>();
    private String rua;
    private String cidade;
    private long id;

    public Carrinho() {
    }

    public Carrinho adiciona(Produto produto) {
        produtos.add(produto);
        return this;
    }

    public Carrinho para(String rua, String cidade) {
        this.rua = rua;
        this.cidade = cidade;
        return this;
    }

    public Carrinho setId(long id) {
        this.id = id;
        return this;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }
    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public long getId() {
        return id;
    }

    public void remove(long id) {
        for (Iterator iterator = produtos.iterator(); iterator.hasNext();) {
            Produto produto = (Produto) iterator.next();
            if(produto.getId() == id) {
                iterator.remove();
            }
        }
    }

    public void troca(Produto produto) {
        remove(produto.getId());
        adiciona(produto);
    }

    public void trocaQuantidade(Produto produto) {
        for (Iterator iterator = produtos.iterator(); iterator.hasNext();) {
            Produto p = (Produto) iterator.next();
            if(p.getId() == produto.getId()) {
                p.setQuantidade(produto.getQuantidade());
                return;
            }
        }
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public String toXML() {
            return new XStream().toXML(this);

    }

}

Classe produto com as anotations do jaxb

package br.com.alura.loja.modelo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Produto {

    private double preco;
    private long id;
    private String nome;
    private int quantidade;

    public Produto() {
    }

    public Produto(long id, String nome, double preco, int quantidade) {
        this.id = id;
        this.nome = nome;
        this.preco = preco;
        this.quantidade = quantidade;
    }

    public double getPreco() {
        return preco;
    }

    public long getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public double getPrecoTotal() {
        return quantidade * preco;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }
}

método de teste

@Test
    public void testaQueBuscarUmCarrinhoTrazOCarrinhoEsperado() {

        Carrinho carrinho = webTarget.path("/carrinhos/1").request().get(Carrinho.class);
        Assert.assertEquals("Rua Vergueiro 3185, 8 andar", carrinho.getRua());
    }

segue o stack trace

set 04, 2019 8:40:15 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.5 2013-12-18 14:27:29...
set 04, 2019 8:40:16 PM org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [localhost:8080]
set 04, 2019 8:40:16 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
set 04, 2019 8:40:16 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Sending client request on thread main
1 > GET http://localhost:8080/carrinhos/1

set 04, 2019 8:40:16 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Client response received on thread main
2 < 500
2 < Connection: close
2 < Content-Length: 0
2 < Date: Wed, 04 Sep 2019 23:40:16 GMT

set 04, 2019 8:40:16 PM org.glassfish.grizzly.http.server.NetworkListener stop
INFO: Stopped listener bound to [localhost:8080]
4 respostas

Olá Anderson!

Tenta adicionar essa anotação em cima da sua classe Carrinho:

@JsonRootName(value = "carrinho")

Ele seria equivalente ao @XmlRootElement. Veja se funciona pra ti.

Aguardo seu retorno.

Boa Noite Guilherme.

Minha vida tem estado um tanto corrida e só consegui ver o seu post agora.

Tentei colocar a anotação acima, porém ela não foi reconhecida.

Será q preciso de alguma biblioteca especifica para utiliza-la? Estou usando java 11.

Abraços.

Olá Anderson!

Tenta inserir essa dependência no seu pom.xml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>

Espere a IDE baixar a biblioteca e vá para a classe.

Aperte CTRL + SHIFT + O para importar no eclipse ou ALT + ENTER para importar no Intellij IDEA.

Ou você pode importar de forma manual:

import com.fasterxml.jackson.annotation.JsonRootName;

Boa Noite Guilherme.

O projeto dos exercícios não está configurado com maven.

Baixei separado a biblioteca, setei ela no Build Path do projeto, mas mesmo assim não estou conseguindo importar. Baixei a mesma versão da dependência que você indicou.