Download com VRaptor [RESOLVIDO]

Pessoal, estou com o seguinte problema, tenho que disponibilizar para o usuário fazer o download de um relatório com o VRaptor. Eu já fiz isso somente com servlet. Ficou assim:

String dados = FormatLayout.getList(empresa, codigo);

String nome = codigo + ".txt";
String caminho = (getServletContext().getRealPath("\\downloads\\") + nome);

FileOutputStream fileOut = new FileOutputStream(caminho);
fileOut.write(dados.getBytes());

response.setContentType("inline/download");
String arq = "attachment;filename=" + nome;
response.setHeader("Content-Disposition", arq);

ServletOutputStream os = response.getOutputStream();
os.write(dados.getBytes());
fileOut.flush();
os.flush();
os.close();

Eu tenho que fazer o mesmo, mas com o VRaptor. Eu li o tutorial do site: http://www.vraptor.org/pt/file-download.html mas não entendi direito. Alguém sabe como fazer?

Desde já, muito obrigado! :mrgreen:

Tentei fazer assim:

@Viewless
public void geraRelatorio() throws IOException {
	String dados = gerarDados();

	clientOutput.setContentType("inline/download");

	ServletOutputStream os = clientOutput.getOutputStream();
	os.write(dados.getBytes());
	os.flush();
	os.close();
}

Mas acho que está incompleto. Alguém tem alguma idéia? Valew!

Ninguém?

O que acontece? Qual é o erro?

A idéia daquele tutorial é que se você injetar o HttpServletResponse pelo construtor, pode escrever sua lógica igualzinha àquela sua Servlet.

Oi Sérgio, obrigado pela sugestão, eu já tinha feito dessa forma mesmo, mas imaginei que o VRaptor tivesse uma forma diferente de fazer isso, sem utilizar o response. Vou colocar a solução:

@Viewless
public void geraRelatorio() throws IOException {
	String dados = gerarDados();

	String nome = codPedidoRel + ".txt";

	FileOutputStream fileOut = new FileOutputStream(nome);
	fileOut.write(dados.getBytes());
	fileOut.flush();
	fileOut.close();

	response.setContentType("inline/download");
	String arq = "attachment;filename=" + nome;
	response.setHeader("Content-Disposition", arq);

	ServletOutputStream os = response.getOutputStream();
	os.write(dados.getBytes());
	os.flush();
	os.close();
}

Obrigado pela ajuda! :mrgreen:

@von.Juliano

Vc poderia jogar todo o seu codigo numa lógica de vraptor. So precisa injetar o HttpServletResponse usando constructor injection ou @In (também precisa @Viewless acima do metodo).

http://www.vraptor.org/injection.html

Mas a ideia do tuturial e do vraptor em geral eh que vc nao mexe nas lógicas com a api Servlet seja Response ou Request ou Session ou …

Por isso o tutorial usa um wrapper ClientOutput que embrulha o HttpServletResponse. O Interceptor serve para criar esse wrapper. Na sua lógica vc usa o wrapper e fica livre da api servlet.

[]'s,
Nico

Oi Nico, cara eu acabei entendendo o exemplo do tutorial, e tentei implemetar da mesma forma que ele apresenta, só que não funcionou! Quando eu tentava usar algum método de ClientOutput, dava NullPointerException! A minha classe ClientOutput e a DownloadInterceptor estava IDÊNTICAS as do site. Acho que o interceptor é que não funcionava…

Mas tudo bem, mesmo que o problemas não tenha sido resolvido da forma mais “nobre” :XD: . Valew!!!

Veja a linha do NullPointerException… assim voce descobre o que era null… e ai consegue encontrar qual linha nao foi executada que inicializava a sua variavel.

abraço

Oi Guilherme, obrigado por responder o tópico!
Olha só, a NullPointerException ocorre por que o ClientOutput está nulo, e se é no interceptor que ele é inicializado então acho o problema é que o interceptor não funciona! Sabe por que isso acontece?

Muito obrigado! :mrgreen: