Erro Vraptor + Uploadify

7 respostas
R

Estou fazendo uma tela de upload, utilizando-se do jquery Uploadify…

Conseguindo ler meu arquivo… o controller recebe… mais estou simulando um erro… e tentando retornar com validator.onErrorSendBadRequest(); mas me apresenta um erro.

controller:

@Post @Path("/importador/importararquivoposto") public void importarArquivoPosto(CentroDeCustos centroDeCustos , final UploadedFile Filedata) { this.validator.validate(UnidadeMedida.class); try { this.importadorArquivoTxt.carregarArquivo(1, "").importarArquivo(); } catch (FileNotFoundException e) { validator.add(new ValidationMessage("Arquivo não encontrado","nomeInvalido")); } catch (IOException e) { result.use(Results.http()).setStatusCode(400); } validator.onErrorSendBadRequest(); }

O erro que aperece no meu console é:

GRAVE: Servlet.service() for servlet [default] in context with path [/webdip] threw exception br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.diplomata.interceptors.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.diplomata.interceptors.VerificaLoginInterceptor.intercept(VerificaLoginInterceptor.java:38) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:131) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45) at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54) at br.com.caelum.vraptor.view.DefaultValidationViewsFactory$1.intercept(DefaultValidationViewsFactory.java:73) at br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56) at br.com.caelum.vraptor.view.Status$$EnhancerByCGLIB$$41704471.badRequest(<generated>) at br.com.caelum.vraptor.validator.AbstractValidator.onErrorSendBadRequest(AbstractValidator.java:63) at br.com.diplomata.controllers.ImportFileController.importarArquivoPosto(ImportFileController.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61) ... 49 more

Será que é possivel retornar um erro via: validator.onErrorSendBadRequest();

7 Respostas

Lucas_Cavalcanti

tem mais coisa nessa exception?

ele provavelmente está dando um ClassNotFound no xstream (no onErrorSendBadRequest ele tenta serializar os erros)

R

Lucas Cavalcanti:
tem mais coisa nessa exception?

ele provavelmente está dando um ClassNotFound no xstream (no onErrorSendBadRequest ele tenta serializar os erros)

Acho que encontrei o problema…

É que tenho um interceptor que verifica se usuario esta logado. e como o plugin utiliza-se de flash. a sessão é outra. estou correto?

Tenho duas duvidas, vamos ver podme me ajudar?

  1. Esta questão da sessão, é melhor criar um form separa para upload, passando o iddasessao, e uma anotação para meu interceptor entender que não valido o metodo em questão? ou tenho uma forma de passar a sessão?

  2. O badrequest funcionou, no console agora aparece a mensagem de The file size limit was exceeded.
    Como poderia tratar isto no evento onError do uploadify. Não consegui fazer isto.

Obrigado pela ajuda

Lucas_Cavalcanti

sim, o flash usa outra sessão…

pra fazer o upload sem a sessão vc pode passar o jsessionID no form (talvez vc tenha que guardar um mapa de jsessionID pra usuário em algum lugar) ou vc pode gerar uma url com um hash (MD5 ou SHA1 + SALT) na frente, de acordo com o id do usuário, daí vc valida isso.

no onError não aparece esse erro? vc não consegue receber como parâmetro da function algum valor relevante?

R
Lucas Cavalcanti:
sim, o flash usa outra sessão...

pra fazer o upload sem a sessão vc pode passar o jsessionID no form (talvez vc tenha que guardar um mapa de jsessionID pra usuário em algum lugar) ou vc pode gerar uma url com um hash (MD5 ou SHA1 + SALT) na frente, de acordo com o id do usuário, daí vc valida isso.

no onError não aparece esse erro? vc não consegue receber como parâmetro da function algum valor relevante?

Lucas, ele estava passando no meu controller. criei uma anotação para metodo, e no controle anoto o metodo:

@Upload
	@Post
	@Path("/upload")
	public void uploadArquivo(String SessionId, final UploadedFile Filedata) {
		result.use(Results.http()).body("1");
		validator.onErrorSendBadRequest();
		//validator.onErrorUse(page()).of(IndexController.class).erro();
		//validator.onErrorRedirectTo(IndexController.class).erro();

	}
com relação ao erro do validator, de tamanho de arquivo, com
validator.onErrorSendBadRequest();
realmente não consigo pegar no onError.. do uploadify.. ele apenas mostra um erro HTTP . com codigo 406.. Tentei redirecionar
validator.onErrorRedirectTo(IndexController.class).erro();
para um jsp de erro.. mais ele me dá erro 302. dai não funciona tb.. E se colocar
validator.onErrorUse(page()).of(IndexController.class).erro();
Error: HTTP Info: 404

Sinceramente, to perdido, já não sei pra onde ir..

Lucas_Cavalcanti

pq tem o body(“1”) antes do validator?

R

unica forma que encontrei para o uploadify marcar como completo o upload do arquivo…

Lucas_Cavalcanti

faça no seu método de upload:

validator.onErrorSendBadRequest()

result.nothing()

isso não funciona?

Criado 3 de agosto de 2011
Ultima resposta 4 de ago. de 2011
Respostas 7
Participantes 2