[RESOLVIDO] Como abortar uso do VRaptorRequest, e usar o tradicional HttpServletRequest?

Pessoal boa tarde.

Inclui o VRaptor em minha aplicação em andamento.
Tenho uma tela que fazia o upload de um arquivo .xls, o lia e o inseria no banco.

Porém como passei a usar o VRaptor, no meu servlet responsável pelo upload, é passado o objeto VRaptorRequest, no lugar do HttpServletRequest.

[size=9]aqui no request e response, chegam VRaptorRequest e response, ao invés do tradicional.[/size]

Acontece que está dando um erro por isso, já testei sem o VRaptor e tudo funfou direitinho.

A pergunta é: como deixar de usar o VRaptorRequest nesse momento em que preciso do HttpServletRequest?
Já tente um Cast e não deu certo.

obrigado

Antes de mais nada o ideal é que você nos diga o erro que dá, logs, etc…

Não conheço a classe VraptorRequest, isso é do 2.6? No 3 se não me engano é MutableRequest (preciso pesquisar melhor, mas creio que seja isso). Mas você precisa mesmo usar esse componente ou pode usar o componente para upload do vraptor? Ele não te satisfaz?

Para usá-lo basta fazer seu método receber UploadedFile como parametro e só… o resto o vraptor faz por você.

Abraços

Opa.

Estou usando o VRaptor 3.0 e é isso mesmo que chega como request, um VRaptorRequest.

Bom, eu como não entendo muito, e minha lógica da aplicação estava tudo pronta, queria manter o que já estava.(maldita hora que resolvi mudar um projeto em andamento)

Pois bem, nao estou desanimando, mas como a lógica está pronta queria usar o HttpServletRequest, e não o VRaptorRequest. Ou seja, queria sobrescrever, alterar, eliminar, ou fazer o que seja pra que meu objeto seja o nativo do meu servlet?

aqui vai como estou fazendo no momento

[code]DiskFileUpload fu = new DiskFileUpload();

			List fileItems = fu.parseRequest(request);
			fu.setRepositoryPath(getServletContext().getRealPath("/"));
			Iterator i = fileItems.iterator();				
			FileItem fi = (FileItem)i.next();
			InputStream in = fi.getInputStream();
			String nomeBaseDados = fi.getName();
			Long tamBaseDados = fi.getSize();
			
			File file = new File(fu.getRepositoryPath() + "\\temp\\tabela.xls");
			FileOutputStream fos = new FileOutputStream(file);

int c;
;

			while((c = in.read()) != -1)
			fos.write(c);
			fos.close();

[/code]

o único erro que dá é esse:

Pois quando ele tenta pegar FileItem fi = (FileItem)i.next(); ele está vazio

Pois bem, só não queria ter q mudar isso tudo que já está prontinho, e redondinho =)

agradeço as ajudas =D

Você não precisa de tudo isso não. Ao invés dessas 18 linhas de código basta você fazer:

public void myUpload(UploadedFile arquivo) { // aqui você pode por exemplo salvar no disco File target= new File(""); IOUtils.copyLarge(arquivo.getFile(), new FileOutputStream("/tmp/tabela.xls")); }

Aqui em outro thread sobre isso: http://www.guj.com.br/posts/list/15/145804.java

Agradeço a ajuda, mas insisto em uma coisa.

Tem como eu usar o HttpServletRequest ao invés do VRaptorRequest?

Caso não tenha como, quem vai me passar esse UploadedFile arquivo ?

Pois no caso que estou usando, ele está no request, e pego ele aqui ó:

[code]DiskFileUpload fu = new DiskFileUpload();

			List fileItems = fu.parseRequest(request);
			fu.setRepositoryPath(getServletContext().getRealPath("/"));
			Iterator i = fileItems.iterator();				
			FileItem fi = (DefaultFileItem)i.next();[/code]

Da forma que estou fazendo, está claro pra mim. Gostaria de manter isso se possível.
Só não entendi bem como vai funcionar o upload pelo VRaptor, lembrando que uso um multipart-form pra pegar o caminho do arquivo, e no proprio servlet ele já trata tudo pra mim.

Obrigado =]

a.moraissoares, request na verdade não existe. HttpServletRequest é uma interface onde normalmente o container que implementa isso. O que o vraptor faz é criar apenas uma wrapper para o request, sendo que no fundo você tem todas as mesmas funcionalidades que você teria com o request normal.

Talvez o Lucas saiba de alguma coisa, ou talvez possa haver um bug mesmo.

Antes de mais nada, HttpServletRequest é uma interface, não tem como passar “só ela”. VRaptorRequest é uma classe que implementa essa interface…

Se quiser saber como funciona upload no vraptor, veja: http://vraptor.caelum.com.br/documentacao/downloading/

esse UploadedFile é criado pelo vraptor, a partir de um formulário de upload…

se seu tiver name=“meuArquivo”, vc vai receber na sua lógica:

public void upload(UploadedFile meuArquivo) {...}

e para usá-lo siga os exemplos da documentação que eu te mandei

Ok. Resolvido da forma que me sugeriram.

A pergunta que fica, e que não entendi ainda.

NÃO TEM COMO eu abortar o uso do VRaptorRequest e utilizar o HttpServletRequest ?

Digamos que eu precise disso de forma urgente, sem tempo pra modificar o código. Como eu faria? Obrigado pelas sugestões, e aguardo essa resposta pra botar no topico [RESOLVIDO]

Não existe. É como falamos acima, HttpServletRequest não existe sozinha, tem que haver uma implementação por baixo, e no caso do vraptor a implementação é a VraptorRequest (eu achava que era MutableRequest).

O ideal, já que você insiste muito em usar sua implementação manual via request, é tentar fazer um debug e investigar porque está acontecendo esse erro.

Abraços

vc, em geral, não vai precisar pegar a implementação “padrão” do HttpServletRequest, pois o VraptorRequest só é um wrapper: ele sempre chama os métodos da implementação padrão…

o que aconteceu no upload é q o vraptor já processa o Multipart request antes de ir pra sua lógica… e qdo vc tenta processar de novo já não tem nada mais pra processar, por isso o null pointer…

só pra concluir: não faz diferença nenhuma usar o VRaptorRequest ou o request que ele tá fazendo o wrapping…

Será que não é interessante colocar isso com observação na documentação referente a upload?

Então mesmo eu não “pedindo” o VRaptor já estava tratando os dados quando chegavam no meu servlet, certo?
Logo é impossível tratar da forma que eu tratava, utilizando FileItem, certo?

Se o que entendi está certo, logo o post foi resolvido.
Agradeço pela explanação.

Obrigado

[quote=a.moraissoares]Então mesmo eu não “pedindo” o VRaptor já estava tratando os dados quando chegavam no meu servlet, certo?
Logo é impossível tratar da forma que eu tratava, utilizando FileItem, certo?
[/quote]
O VRaptor faz isso e muitas outras coisas sem vc pedir. É pra isso que um framework serve, pra fazer todo o trabalho sujo e facilitar o seu trabalho…

se vc ainda assim prefere usar o FileItem ao invés de um UploadedFile, dá pra desabilitar o MultipartInterceptor, que é o componente que processa a requisição
Multipart.

crie uma classe igual a essa: http://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/core/DefaultRequestExecution.java
só que com um nome diferente, e no pacote da sua aplicação…

anote a classe com @Component
remova a linha que adiciona o MultipartInterceptor
e seja feliz tratando requisições na mão :wink:

Perfeito. Não que eu vá fazer essa loucura, uma vez que consegui fazer com o VRaptor.
A pergunta acho que procede, uma vez que tive que fazer algumas boas alterações no meu projeto, que me custaram umas 2h de trabalho.

Imagina um projeto beeeem maior, em que estejam loucamente adaptando um framework no meio do projeto, e queiram usar do método “antigo”. Aqui vai uma boa explicação

RESOLVIDO e muito obrigado