WebService com Jersey retorna Json vazio

6 respostas
java
L

No Response o json é gerado, mas está sendo retornado vazio. Ao “debugar” verifiquei que os dados que quero que sejam inseridos no json são retornados com sucesso do banco e o objeto que quero retornar traz os dados corretamente, só que na hora da construção do json os dados não são inseridos. Segue o código:

Método na classe DAO (que faz as consultas no banco)

public ArrayList<Aluno> retornaAluno(String codigoResponsavel) {
        try {
            if(!verificaCodigoNoMetodo(codigoResponsavel).equals("0")){
                ArrayList<Aluno> listaAluno = new ArrayList<Aluno>();
                String sql = "SELECT A.ID, A.NOME, A.SERIE, A.TURMA FROM TB_ALUNO A INNER JOIN TB_ALUNO_RESPONSAVEL B ON B.ALUNO_ID = A.ID " 
                + "INNER JOIN TB_CODIGO C ON B.RESPONSAVEL_ID = C.RESPONSAVELID WHERE C.IDALUNO IS NULL AND C.CODIGO = ?";
                PreparedStatement stmt = connection.prepareStatement(sql);
                stmt.setString(1, codigoResponsavel);
                ResultSet rs = stmt.executeQuery();
                
                while(rs.next()){
                    Aluno aluno = new Aluno();
                    aluno.setIdAluno(rs.getInt("id"));
                    aluno.setNome(rs.getString("nome"));
                    aluno.setSerie(rs.getString("serie"));
                    aluno.setTurma(rs.getString("turma"));
                    listaAluno.add(aluno);
                }
                
                stmt.close();
                rs.close();
                connection.close();
                logger.info("retornaAluno chamado com sucesso.");
                return listaAluno;
            }else{
                logger.info("retornaAluno chamado com sucesso.");
                return null;
            }
        } catch (SQLException e) {
            logger.error("Ocorreu uma falha na consulta no método retornaAluno", e);
            throw new RuntimeException("Ocorreu uma falha na consulta no método retornaAluno");
        }
    }

Método na classe Controler (que faz a parte do controler do MVC)

public ArrayList<Aluno> retornaAluno(String nomeEscola, String codigoResponsavel) {
        return new WSDao(nomeEscola).retornaAluno(codigoResponsavel);
}

Método da classe WebResources (classe que contém os recursos e responde as requisições)

@GET
    @Path("/retornaAluno/{nomeEscola}/{codigoResponsavel}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response retornaAluno(@PathParam("nomeEscola") String nomeEscola, @PathParam("codigoResponsavel") String codigoResponsavel) {
        ArrayList<Aluno> listaAluno = new Controler().retornaAluno(nomeEscola, codigoResponsavel);
        if(listaAluno != null){
            logger.info("Resposta do retornaAluno enviada com sucesso");
            return Response.status(200).entity(listaAluno).build();
        }else{
            logger.info(MSG_COD_RESP_NAO_ENCONTRADO);
            return Response.status(200).entity(MSG_COD_RESP_NAO_ENCONTRADO).build();
        }
    }

Classe Aluno

package Bean;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Aluno {

    private String nome;
    private String codigo;
    private String serie;
    private String turma;
    private int idAluno;

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public void setTurma(String turma) {
        this.turma = turma;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public void setIdAluno(int idAluno) {
        this.idAluno = idAluno;
    }
}

Arquivo web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Nome_do_projeto</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</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>pacote_onde_fica_os_recursos</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>log4jContextName</param-name>
    <param-value>Nome_do_projeto</param-value>
  </context-param>
  <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>
</web-app>

Como o json está sendo gerado (quando quero retornar dois objetos, por exemplo)

[
  {},
  {}
]

6 Respostas

D

Faça um debug nessa parte, e verifique o retorno!

public ArrayList<Aluno> retornaAluno(String nomeEscola, String codigoResponsavel) {
    //debug linha abaixo!
    ArrayList<Aluno> alunos = new WSDao(nomeEscola).retornaAluno(codigoResponsavel);
    return alunos;
}
L

Fiz como vc sugeriu e o problema persistiu. Só para ressaltar eu coloquei dessa forma, usando um objeto anônimo, porque se trata apenas de um retorno e não vi a necessidade de criar uma variável que só usaria memória de forma desnecessária. Tenho outros métodos que foram escritos da mesma forma que mencionei no início do tópico e estão funcionando corretamente. No debug eu não consigo ver se tem alguma coisa errada com o Jersey.

D

Desnecessário é a forma como se interpreta o código, porque o retorno do seu método é ArrayList<Aluno> e não é aumento ou diminuição de desempenho ou memória, o que eu propus é que você leia a linha anterior de alunos e verifique se a mesma tem elementos em uma lista tipada!

Então dê uma melhor analisada no seu código e não seja um simples entusiasta! lembrando que aqui é um forma de auxiliar!

L

Esqueci de mencionar que ao fazer o debug da forma que vc sugeriu a lista de alunos é retornada corretamente, mas ainda assim o json é retornado vazio.

D

nesse trecho acima está retornando Response não teria que ser JSONObject ?

Está assim:

public Response retornaAluno(@PathParam("nomeEscola")

coloque assim:

public JSONObject retornaAluno(@PathParam("nomeEscola")

E não sou de Java mas, tento ajudar ao máximo:

Link de referencia: http://stackoverflow.com/a/14621300

L

Consegui resolver o problema. O problema
estava na classe Aluno. Eu havia removido os métodos get de cada
atributo, pois não estavam sendo usados em lugar nenhum do meu código,
mas ao colocar de voltar os métodos get dos atributos na classe Aluno os
dados voltaram a aparecer no Json. Por algum motivo na hora de
serializar o Jersey usa os métodos get dos atributos, então a dica é: se
utilizar Jersey para construir um web service nas classes Bean deixem
os métodos get mesmo que não sejam usados por outras classes.

Criado 9 de agosto de 2016
Ultima resposta 11 de ago. de 2016
Respostas 6
Participantes 2