Imprimir um objeto json usando spring 3

9 respostas
A

http://localhost:8070/tarefas/calendario/get_events

estou tentando imprimir um objeto json usando spring 3, mas tá bem complexo. meu controller tá assim:
@RequestMapping(value="/calendario/{valor}", method = RequestMethod.GET)
	public @ResponseBody JSONObject montaCalendario(@PathVariable String valor) {
		System.out.println(valor);
		CalendarioDAO dao = new CalendarioDAO();
		JSONObject eventos = dao.getEventos(valor);
		return eventos; 
	}
e o meu dao assim:
public JSONObject getEventos(String valor) {
		
		// pega a data atual
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.YEAR, -1);
		String start = sdf.format(cal.getTime());
		cal.add(Calendar.YEAR, +2);
		String end = sdf.format(cal.getTime());
		//System.out.println( "Resultado: " + start + ", fim: " + end );
		
		try {
			JSONArray eventos = new JSONArray(); 

			String sql = "SELECT * FROM agenda WHERE start >= '" + start + "' AND start <= '" + end + "'";
			//System.out.println(sql);
			PreparedStatement stmt = this.connection.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
            	// criando o objeto json
            	JSONObject obj = new JSONObject();
            	obj.put("id", rs.getLong("id"));
            	obj.put("title", rs.getString("title"));
            	obj.put("body", rs.getString("body"));
            	obj.put("start", rs.getString("start"));
            	obj.put("end", rs.getString("end"));
            	obj.put("user_id", rs.getLong("user_id"));
            	obj.put("pupil_id", rs.getLong("pupil_id"));
            	eventos.add(obj);
            }
                        
            JSONObject objeto = new JSONObject();
            objeto.put("events", eventos);
            
            //System.out.println(objeto);
            
            rs.close();
            stmt.close();
	        
            return objeto;
            
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

só que não consigo saber como faço pra imprimir o "objeto" quando acesso localhost/teste/calendario

alguém pode me dar uma luz?

obrigado

9 Respostas

G

Fala andreacerqueira, beleza?

Cara, a maneira mais fácil de fazer o que você precisa é utilizando o jackson.
Ele converte o seu objeto para JSON automáticamente e tem uma boa integração com o Spring MVC.

Você pode ver um exemplo na prática no link abaixo:
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

D

Outra alternativa é usar a biblioteca Gson: http://code.google.com/p/google-gson/
Ela é muito fácil de usar.

Gson gson = new Gson(); String json = gson.toJson( seuObjeto );
[]'s

A

Gbzao!:
Fala andreacerqueira, beleza?

Cara, a maneira mais fácil de fazer o que você precisa é utilizando o jackson.
Ele converte o seu objeto para JSON automáticamente e tem uma boa integração com o Spring MVC.

Você pode ver um exemplo na prática no link abaixo:
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/


Então tinha visto esse tutorial, mas o link pra download dele está quebrado e como teria que fazer tudo novamente, desisti.

Vou tentar algo

A

davidbuzatto:
Outra alternativa é usar a biblioteca Gson: http://code.google.com/p/google-gson/
Ela é muito fácil de usar.

Gson gson = new Gson(); String json = gson.toJson( seuObjeto );
[]'s

David, valeu pela dica, vou procurar na net.
O lance é que eu já tenho o objeto perfeitinho. Dou um syso e ele imprimi direitinho.
Com sua dica vou ter que refazer tudo provavelmente.
Mas vou ver.
Vlw

D

Refazer o que? Você já vai obter todo o JSON, formatado corretamente, e sem esse monte de código para criar um JSONObject manualmente. Se ainda quiser retornar uma JSONObject (não pode retornar a String diretamente?), basta usar o JSON gerado pelo Gson para construir um novo JSONObject.

A
tentei o gson:
Gson gson = new Gson();
String json = gson.toJson(eventos);
mas mudou de 6 pra meia dúzia, pois minha dúvida é na hora de mostrar e não montar o json, o meu json já está montado. quando dou um SYSO ele me retorna correto: {"events":[{"id":1,"title":"Agora","body":"kkdf lhdgdkj hfflkjgh flkjgh lfhglkjhlsk lfghj ljhgflhglghlj.","start":"2012-07-12 09:00:00.0","end":"2012-07-12 10:30:00.0","user_id":1,"pupil_id":2},{"id":2,"title":"dfgdsfgfd","body":"dfv","start":"2012-07-11 10:00:00.0","end":"2012-07-11 15:30:00.0","user_id":1,"pupil_id":1},{"id":3,"title":"Tchu","body":"Vai vai vai vai vai vai vai vai.","start":"2012-07-13 11:30:00.0","end":"2012-07-13 15:30:00.0","user_id":1,"pupil_id":5},{"id":4,"title":"333333333333","body":"444444444444444","start":"2012-07-11 16:30:00.0","end":"2012-07-11 17:30:00.0","user_id":1,"pupil_id":22},{"id":5,"title":"Vai porrraaaaaa","body":"kjh jkh","start":"2012-07-12 20:30:00.0","end":"2012-07-12 21:30:00.0","user_id":1,"pupil_id":6}]}

meu problema é pra mostrar essa tela de retorno, pois isso vai ser usado no week calendar de jquery.

tô tentando isso, mas tá me retornando erro:
@RequestMapping(value="/calendario/{valor}", method = RequestMethod.GET)
	public @ResponseBody String montaCalendario(@PathVariable String valor, HttpServletResponse response) 
			throws Exception {
		
		if (valor.equals("get_events")) {
			//System.out.println(valor);
			CalendarioDAO dao = new CalendarioDAO();
			JSONObject eventos = dao.getEventos(valor);
			//response.setContentType("application/json");
			PrintWriter out = response.getWriter();
			out.println(eventos);
		}
		
		return "calendar"; 
	}

erro:
java.lang.IllegalStateException: getWriter() has already been called for this response

W

Se você tá anotando o método com @ResponseBody, significa que o método vai retornar a resposta diretamente, sem direcionamentos. Nesse caso, não precisa de writers. Simplesmente retorne o JavaBean que o spring converte:

@RequestMapping(value="/calendario/{valor}", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody Evento montaCalendario(@PathVariable String valor) 
	throws Exception {
		
        if (valor.equals("get_events")) {
		CalendarioDAO dao = new CalendarioDAO();
                Evento evento = dao.getEventos(valor);
                return evento;
	}
	return "calendar";  // pq calendar aqui? 
}

Pq tu não tá injetando o DAO? Já que tá usando spring, aproveite e use injeção de dependências e controle transacional. :smiley:

E em relação a esse calendar, eu recomendo evitar esses ifs. Faça o mapeamento diretamente pra uma url que retorne os eventos… algo assim:

@RequestMapping(value="/calendario/get_events", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody Evento montaCalendario() 
	throws Exception {
		
	CalendarioDAO dao = new CalendarioDAO();
         Evento evento = dao.getEventos(valor);
         return evento;
}

As outras funcionalidades tu faz em outros métodos!

A

perfeito wagner :slight_smile:
sobre “injeção de dependências e controle transacional” que vc falou, eu não sei como funciona por isso fui testando tudo o que eu sabia (meu conhecimento é limitado) :slight_smile:
vou dar uma pesquisada.
muito obrigado.

W

beleza. :smiley:

Quando puder estude sobre o core do spring então, tem muita coisa bacana!

Criado 20 de julho de 2012
Ultima resposta 21 de jul. de 2012
Respostas 9
Participantes 4