6
respostas

Erro ao levantar o servidor. Sigo todo o passo a passo, mas dá erro dizendo que o recurso está vazio. Alguém poderia me ajudar?

package br.com.alura.loja;

import java.io.IOException;
import java.net.URI;

import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

public class Servidor {
    public static void main(String[] args) throws IOException{
        ResourceConfig config = new ResourceConfig().packages("br.com.alura.loja");
        URI uri = URI.create("http://localhost:8080");
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, config);
        System.out.println("Servidor Rodando!");
        System.in.read();
        server.stop();
    }
}
6 respostas

OI Vanessa, pode colar aqui a pilha de erro gerado pela exception? Para a gente ter uma noção exata de qual é o erro.

Oi Alberto, a mensagem que está aparecendo no console é está:

jul 13, 2017 3:25:13 PM org.glassfish.jersey.server.ApplicationHandler initialize INFORMAÇÕES: Initiating Jersey application, version Jersey: 2.5 2013-12-18 14:27:29... jul 13, 2017 3:25:14 PM org.glassfish.jersey.internal.Errors logErrors ADVERTÊNCIA: The following warnings have been detected: WARNING: A resource, Resource{"carinhos", 0 child resources, 0 resource methods, 0 sub-resource locator, 0 method handler classes, 0 method handler instances}, with path "carinhos" is empty. It has no resource (or sub resource) methods neither sub resource locators defined.

jul 13, 2017 3:25:15 PM org.glassfish.grizzly.http.server.NetworkListener start INFORMAÇÕES: Started listener bound to [localhost:8080] jul 13, 2017 3:25:15 PM org.glassfish.grizzly.http.server.HttpServer start INFORMAÇÕES: [HttpServer] Started. Servidor Rodando!

Agora a servidor está rodando. Mas quando eu vou em http://localhost:8080/carinhos, a página não carrega. Acho que o problema está relacionado com essa mensagem Warning acima, mas não estou sabendo como resolver...

Alguém poderia me ajudar?!

Pelo que entendi da mensagem, ele indica que a classe que representa seu resource não tem nenhum método para responder... coloca a classe aqui? tenta colocar tudo que está envolvido numa requisição que você ta fazendo.

package br.com.loja;

import java.io.IOException;
import java.net.URI;

import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

public class Servidor {

    public static void main(String[] args) throws IOException {
        HttpServer server = inicializaServidor();
        System.out.println("Servidor rodando");
        System.in.read();
        server.stop();
    }

    public static HttpServer inicializaServidor() {
        ResourceConfig config = new ResourceConfig().packages("br.com.loja");
        URI uri = URI.create("http://localhost:8080/");
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, config);
        return server;
    }

}
package br.com.loja.dao;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

import br.com.loja.modelo.Carrinho;
import br.com.loja.modelo.Produto;

public class CarrinhoDAO {

    private static Map<Long, Carrinho> banco = new HashMap<Long, Carrinho>();
    private static AtomicLong contador = new AtomicLong(1);

    static {
        Produto videogame = new Produto(6237, "Videogame 4", 4000, 1);
        Produto esporte = new Produto(3467, "Jogo de esporte", 60, 2);
        Carrinho carrinho = new Carrinho()
                                .adiciona(videogame)
                                .adiciona(esporte)
                                .para("Rua Francisco Martins, 265", "Rio de Janeiro")
                                .setId(1l);
        banco.put(1l, carrinho);
    }

    public void adiciona(Carrinho carrinho) {
        long id = contador.incrementAndGet();
        carrinho.setId(id);
        banco.put(id, carrinho);
    }

    public Carrinho busca(Long id) {
        return banco.get(id);
    }

    public Carrinho remove(long id) {
        return banco.remove(id);
    }

}
package br.com.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.google.gson.Gson;
import com.thoughtworks.xstream.XStream;

public class Carrinho {

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

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

}
package br.com.loja.modelo;


public class Produto {

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

    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;
    }
}
package br.com.loja.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import br.com.loja.dao.CarrinhoDAO;
import br.com.loja.modelo.Carrinho;

@Path("carrinhos")
public class CarinhoResource {

    @Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public String busca(@PathParam("id") long id) {
        Carrinho carrinho = new CarrinhoDAO().busca(id);
        return carrinho.toXML();
    }
}

Quando tento levantar o servidor aparece o seguinte erro:

jul 14, 2017 9:58:16 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFORMAÇÕES: Initiating Jersey application, version Jersey: 2.5 2013-12-18 14:27:29...
Exception in thread "main" javax.ws.rs.ProcessingException: IOException thrown when trying to start grizzly server
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:276)
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:110)
    at br.com.loja.Servidor.inicializaServidor(Servidor.java:22)
    at br.com.loja.Servidor.main(Servidor.java:13)
Caused by: java.net.BindException: Address already in use: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
    at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
    at org.glassfish.grizzly.nio.transport.TCPNIOBindingHandler.bindToChannelAndAddress(TCPNIOBindingHandler.java:131)
    at org.glassfish.grizzly.nio.transport.TCPNIOBindingHandler.bind(TCPNIOBindingHandler.java:87)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.bind(TCPNIOTransport.java:449)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.bind(TCPNIOTransport.java:429)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.bind(TCPNIOTransport.java:420)
    at org.glassfish.grizzly.http.server.NetworkListener.start(NetworkListener.java:658)
    at org.glassfish.grizzly.http.server.HttpServer.start(HttpServer.java:264)
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:274)
    ... 3 more

Eu reiniciei o Eclipse e coloquei o servidor pra rodar novamente. Funcionou. Porém, quando tenho acessar o recurso através da url localhost:8080/carrinhos/1, a página não carrega.

Essa é a classe de teste

package br.com.loja;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import org.glassfish.grizzly.http.server.HttpServer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import com.thoughtworks.xstream.XStream;

import br.com.loja.modelo.Carrinho;

public class ClienteTeste {
    private HttpServer server;

    @Before
    public void iniciaServidor(){
        this.server = Servidor.inicializaServidor();
    }

    @After
    public void paraServidor(){
        server.stop();
    }

    @Test
    public void testaCarinho(){
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8080");
        String conteudo = target.path("/carrinhos").request().get(String.class);
        System.out.println(conteudo);
        Carrinho carrinho = (Carrinho)new XStream().fromXML(conteudo);
        Assert.assertEquals("Rua Francisco Martins, 265",carrinho.getRua());
    }
}

Quando executo o teste aparece a seguinte mensagem:

jul 14, 2017 10:49:03 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFORMAÇÕES: Initiating Jersey application, version Jersey: 2.5 2013-12-18 14:27:29...
jul 14, 2017 10:49:04 AM org.glassfish.grizzly.http.server.NetworkListener start
INFORMAÇÕES: Started listener bound to [localhost:8080]
jul 14, 2017 10:49:04 AM org.glassfish.grizzly.http.server.HttpServer start
INFORMAÇÕES: [HttpServer] Started.
jul 14, 2017 10:49:04 AM org.glassfish.grizzly.http.server.NetworkListener stop
INFORMAÇÕES: Stopped listener bound to [localhost:8080]