Imprimir um objeto json usando spring 3

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:

[code]
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);
    }
}[/code]

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

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/

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

[quote=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/[/quote]
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

[quote=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[/quote]

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

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.

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:

[code]@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"; 
}[/code]

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

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!

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.

beleza. :smiley:

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