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
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.
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").
@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.
[{"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.