1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Não consigo criar webservice usando recursos identificados por strings

Eu fiz um webservice para recuperar dados de motoristas, conforme o código abaixo. Os 4 métodos funcionaram perfeitamente. O motorista é identificado por um int:

package br.com.controleVeiculos.resources;

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

import br.com.controleVeiculos.models.Motorista;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/motorista")
public class MotoristaResource {

    private static List<Motorista> lista = new ArrayList<Motorista>();

    static{
        Motorista motorista = new Motorista();
        motorista.setId(1);
        motorista.setNome("Ronaldo");
        lista.add(motorista);

        motorista = new Motorista();
        motorista.setId(2);
        motorista.setNome("Zina");
        lista.add(motorista);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Motorista> listarMotoristas(){
        return lista;
    }

    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Motorista getMotorista(@PathParam("id") int id){
        for(Motorista motorista : lista)
            if (motorista.getId() == id)
                return motorista;
        return null;
    }

    @POST
    @Consumes(MediaType.TEXT_XML)
    @Produces(MediaType.APPLICATION_JSON)
    public String inserirMotorista(Motorista motorista){
        lista.add(motorista);
        return "Motorista " + motorista.getNome() + " incluído.";
    }

    @PUT
    @Consumes(MediaType.TEXT_XML)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{id}")
    public String alterarMotorista(@PathParam("id") int id, Motorista motorista){
        for(Motorista m : lista){
            if (m.getId() == id){
                m.setNome(motorista.getNome());
                return "Motorista alterado para " + m.getNome();
            }
        }
        return "Motorista de id " + id + " não foi encontrado.";
    }

    @DELETE
    @Path("{id}")
    public String removerMotorista(@PathParam("id") int id){
        Motorista motoristaPraRemover = null;
        for(Motorista m : lista){
            if(m.getId() == id){
                motoristaPraRemover = m;
                lista.remove(motoristaPraRemover);
                return "Motorista " + m.getNome() + "removido.";
            }
        }
        return "Motorista não encontrado";
    }
}

Tentei repetir o código para recuperar os dados dos carros. O único método que funciona é o que lista todos os carros. O servidor web simplesmente não retorna o JSON quando eu tento usar os outros métodos. Os carros são identificados por Strings:

package br.com.controleVeiculos.resources;

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

import br.com.controleVeiculos.models.Carro;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/carro")
public class CarroResource {

    private static List<Carro> lista = new ArrayList<Carro>();

    static{
        Carro carro = new Carro();
        carro.setPlaca("ABC1234");
        carro.setModelo("Punto");
        lista.add(carro);

        carro = new Carro();
        carro.setPlaca("ZXY98765");
        carro.setModelo("Fusca");
        lista.add(carro);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Carro> listarCarros(){
        return lista;
    }

    @GET
    @Path("{placa}")
    @Produces(MediaType.APPLICATION_JSON)
    public Carro getCarro(@PathParam("placa") String placa){
        for(Carro carro : lista)
            if (carro.getPlaca() == placa)
                return carro;
        return null;
    }

    @POST
    @Consumes(MediaType.TEXT_XML)
    @Produces(MediaType.APPLICATION_JSON)
    public String inserirCarro(Carro carro){
        lista.add(carro);
        return "Carro " + carro.getModelo() + " incluído.";
    }

    @PUT
    @Consumes(MediaType.TEXT_XML)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{placa}")
    public String alterarCarro(@PathParam("placa") String placa, Carro carro){
        for(Carro m : lista){
            if (m.getPlaca() == placa){
                m.setModelo(carro.getModelo());
                return "Carro alterado para " + m.getModelo();
            }
        }
        return "Carro de placa " + placa + " não foi encontrado.";
    }

    @DELETE
    @Path("{placa}")
    public String removerCarro(@PathParam("placa") String placa){
        Carro carroPraRemover = null;
        for(Carro m : lista){
            if(m.getPlaca() == placa){
                carroPraRemover = m;
                lista.remove(carroPraRemover);
                return "Carro " + m.getModelo() + "removido.";
            }
        }
        return "Carro não encontrado";
    }
}

O arquivo web.xml, caso seja útil:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>controle-veiculos</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Jersey Restful Webservice</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>br.com.controleVeiculos.resources</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Restful Webservice</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

O webservice do carro sempre falha quando eu tento usar os métodos HTTP para um carro individual com essa URL: http://localhost:8080/controle-veiculos/carro/ABC1234. O fato de o carro ser identificado por String e o motorista por int faz diferença na geração do JSON?

  • Isso é porque você está retornando só a String mesmo. Esse método, retorna Json? public Carro getCarro(@PathParam("placa") String placa)

    gabrielfss   31 de ago de 2014
  • O método retorna um objeto Carro mesmo. Tanto a classe Carro quanto Motorista estão anotados com @XmlRootElement. A classe CarroResource é uma cópia da MotoristaResource, eu só mudei os objetos de retorno. O método getMotorista retorna String e funciona perfeitamente. Não entendo porque não funciona.

    gyodiver   02 de set de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jersey webservices web.xml ou faça a sua própria pergunta.