REST + Jersey + JSON
Autor: Adriano Negrão | Publicado: 2014-11-12T16:43:00-02:00

Hoje vamos criar um projeto com API Rest que retorne uma lista de objetos como JSON. Uma das principais dificuldades que encontrei ao criar um projeto sem o Maven, foi encontrar os jars para o retorno do json.
Existem diversos posts com exemplos de utilização de Rest na internet bem simples, porém apenas com os jars recomendado não consegui retornar via json, apenas xml. O grande segredo está nos jars jackson. Então vamos lá...

Crie um Dynamic Web Project no Eclipse:
Minha estrutura ficou assim:






Os jars necessários para aplicação funcionar estão aí. No meu caso, utilizei o servidor Weblogic, mas poderia ser o Tomcat, por exemplo.



web.xml&nbsp;





  LaboratorioRest
  
  
   RestController
   com.sun.jersey.spi.container.servlet.ServletContainer
   
    com.sun.jersey.config.property.packages
    br.com.adriano.rest
   
   
  com.sun.jersey.api.json.POJOMappingFeature
  true
 
  
  
  
   RestController
   /*
  
  


Entendendo...




Definimos um nome para servlet para garantir acesso a API Rest.


RestController
com.sun.jersey.spi.container.servlet.ServletContainer




Definimos um parâmetro para dizer qual package vai conter os serviços Rest.



    com.sun.jersey.config.property.packages
    br.com.adriano.rest





Outro parâmetro necessário para o Jersey converter o objeto em JSON.



 com.sun.jersey.api.json.POJOMappingFeature
 true





Usuario.java





package br.com.adriano.model;
import javax.xml.bind.annotation.*;
public class Usuario {
 
 private String login;
 private String senha;
 public String getLogin() {
  return login;
 }
 public void setLogin(String login) {
  this.login = login;
 }
 public String getSenha() {
  return senha;
 }
 public void setSenha(String senha) {
  this.senha = senha;
 }
 
 @Override
 public String toString() {
  return super.toString();
 }
}






Caso queira retornar XML, você deve anotar @XmlRootElement na classe Usuario. Para Json não é necessário.





UsuarioResource.java





package br.com.adriano.rest;
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import br.com.adriano.model.*;
@Path("/usuarios")
public class UsuarioResouce {
 static private Map usuarioMap;
 static {
  usuarioMap = new HashMap();
  Usuario usuario1 = new Usuario();
  usuario1.setLogin("admin");
  usuario1.setSenha("passAdmin");
  usuarioMap.put(1, usuario1);
  Usuario usuario2 = new Usuario();
  usuario2.setLogin("adriano");
  usuario2.setSenha("adr123");
  usuarioMap.put(2, usuario2);
 }
 @GET
 @Path("/json")
 @Produces(MediaType.APPLICATION_JSON)
 public List getUsuarios() {
  return new ArrayList(usuarioMap.values());
 }
}




Entendendo...



@Path é o caminho que será acessado pela url para chegar até nossa classe UsuarioResource.


@Path("/usuarios")
public class UsuarioResouce 






Criei uma massa de dados como teste apenas para emular dados vindo do banco.&nbsp;



static private Map usuarioMap;
 static {
  usuarioMap = new HashMap();
  Usuario usuario1 = new Usuario();
  usuario1.setLogin("admin");
  usuario1.setSenha("passAdmin");
  usuarioMap.put(1, usuario1);
  Usuario usuario2 = new Usuario();
  usuario2.setLogin("adriano");
  usuario2.setSenha("adr123");
  usuarioMap.put(2, usuario2);
 }









@Produces - Definimos o tipo de retorno de dados que queremos, no caso, JSON. (Caso queria XML utilize ("text/xml").&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;
 @GET
 @Path("/json")
 @Produces(MediaType.APPLICATION_JSON)
 public List getUsuarios() {
  return new ArrayList(usuarioMap.values());
 }






A partir daí, podemos subir a aplicação. Abra o browser e digite o caminho da url do seu projeto. No meu caso foi http://localhost:7001/LaboratorioRest/usuarios/json. Deve aparecer a lista do objeto Usuario em JSON.&nbsp;



[{"login":"admin","senha":"passAdmin"},{"login":"adriano","senha":"adr123"}]




Bom, é isso! Sem os jars 'jackson' a página não retornava o json. Espero ter ajudado.




Código disponível em: https://github.com/adrianonegrao/angular-js&nbsp;pasta lab-rest.

[]s