Vraptor3 + GAE

12 respostas
Edufa

Testando no GAE [nem sei se tem suporte, rs], mas acabei encontrando um erro.
Usando pico
Depois de configurar todos os jars

Executando, aparece esse erro:

java.lang.IllegalStateException: STREAM

Ai fui investigar, mudei o @Path("/" ), para @Path("/teste" ), para ficar mais fácil de localizar
Na inicialização ele se acha

[INFO] 00:35:29,515 INFO [br.com.caelum.vraptor.http.route.RouteBuilder] - /teste --> public void com.teste.IndexController.index()

mesmo assim dá o erro
java.lang.IllegalStateException: STREAM

Segue o erro completo

WARNING: /scimpac2_teste/teste
java.lang.IllegalStateException: STREAM
	at org.mortbay.jetty.Response.getWriter(Response.java:583)
	at br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler.couldntFind(DefaultResourceNotFoundHandler.java:52)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:66)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
	at br.com.caelum.vraptor.ioc.pico.PicoProvider.provideForRequest(PicoProvider.java:184)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:313)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at org.mortbay.jetty.Server.handle(Server.java:313)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

12 Respostas

Paulo_Silveira

Ola!

Curioso, estamos rodando aplicacoes no GAE com VRaptor3 sem problemas. Qual versão voce esta utilizando? Vamos dar uma olhada com cuidado, parece que o getOutputStream ja foi chamado e alguem esta invocando o getWriter apos isso.

A proposito, estamos criando documentacao passo a passo para utilizar o VRaptor3 no GAE.

Edufa

Estranho,
Então acabei de baixar a beta 3, coloquei as libs no projeto peguei o demo e fui rodar e puff deu esse erro
E achei o problema

testando localmente o gae estava me jogando para
http://localhost:8080/scimpac2_teste

e aí ao acessar

http://localhost:8080/scimpac2_teste/teste

dava erro
acessando

http://localhost:8080/teste

o erro sumiu

:wink:

PS1. agora é fazer mais testes, qq problema coloco aqui
PS2. Documentação é sempre bem vinda, ainda mais de quem está usando ha mais tempo :wink: justamente para evitar esses erros bobinhos

Paulo_Silveira

e acho que descobri. o problema é que o VRaptor nao ta conseguindo emitir o sinal de 404, quando voce acessou a pagina nao existente. Isso fica claro por causa disso:

br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler.couldntFind(DefaultResourceNotFoundHandler.java:52)

tente acessar qualquer url nao mapeada, que acho que vai dar esse erro, em vez de um 404 “amigavel”

Lucas_Cavalcanti

Isso era um bug do beta-2… ele tava escrevendo no writer do response depois de mandar o erro 404…

foi corrigido no beta-3

[]'s

Edufa

Pois é eu usei o tres.
@Paulo Silveira
Sim apareceu a página 404,

HTTP ERROR: 404
NOT_FOUND
RequestURI=/scimpac2_teste

Nem me toquei que o link certo era http://localhost:8080/teste

o google deveria me ajudar, não atrapalhar, hehehehe

Mas já foi resolvido, agora estou testando.

Aproveitando descobriram alguma incompatibilidade no VR3 com GAE?

Paulo_Silveira

só nao da pra usar upload de arquivo… porque ele usa o File System temporario
Porem isto está interfaceado, da pra fazer o upload de arquivo pra memoria e processa-lo, e depois descarta-lo. vamos implementar essa possibilidade (mas nao deixa-la default, pois ai qualquer upload de arquivo estaria consumindo muita memoria heap).

Edufa

Eu de volta

Agora com um novo erro

Aqui um pedaço do erro:

The server is running at http://localhost:8080/
04/09/2009 14:14:33 com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /add
br.com.caelum.vraptor.InterceptionException: java.security.AccessControlException: access denied (java.lang.RuntimePermission reflectionFactoryAccess)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:75)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:95)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:61)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
[...]
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission reflectionFactoryAccess)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
	at java.security.AccessController.checkPermission(AccessController.java:546)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
	at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:139)
	at sun.reflect.ReflectionFactory.getReflectionFactory(ReflectionFactory.java:97)
	at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.<init>(SunReflectionFactoryInstantiator.java:24)
	at org.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:69)
	at org.objenesis.ObjenesisBase.getInstantiatorOf(ObjenesisBase.java:75)
	at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:58)
	at br.com.caelum.vraptor.proxy.ObjenesisProxifier.proxify(ObjenesisProxifier.java:28)
	at br.com.caelum.vraptor.view.DefaultLogicResult.redirectTo(DefaultLogicResult.java:106)
	at br.med.scimpac.controller.IndexController.add(IndexController.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:59)
	... 49 more

O erro indica que aconteceu nessa linha

result.use(Results.logic()).redirectTo(IndexController.class).index();
Paulo_Silveira

usamos a biblioteca objenesis para alguma magia negra com reflection, e parece que não há permissao para usar os truques de instanciar sem passar pelo construtor de um objeto… (security manager do googe nao ta deixando)…
vamos ver
voce so foi acessar uma url que recebe parametro no metodo, é isso?

Edufa

@Paulo Silveira
Nada como um pouco de magia negra para alegrar uma sexta feira

Não to recebendo nenhum parametro, o codigo é bem simples justamente para testar os conceitos para eu poder colocar projetos maiores com mais segurança.
No caso está incluindo via JPA sem problemas, o erro está mesmo no result.use

@Path("/add")
	public void add() {
		Usuario u = new Usuario();
		u.setNome("Usuario");
		usuarios.add(u);
		result.use(Results.logic()).redirectTo(IndexController.class).index();
	}

	@Path("/inicio")
	public List<Usuario> index() {
		return this.usuarios.list();
	}
Lucas_Cavalcanti

cria uma classe assim:

@Component
@ApplicationScoped
public class MyProxifier extends br.com.caelum.vraptor.proxy.DefaultProxifier {

}

deve resolver o problema… esse proxifier não usa o objenesis pra criar os proxies…

só que usando este você vai ter que prevenir NullPointer exception nos parâmetros do construtor…

[]'s

Edufa

@lucascs
Opa, funcionou redondinho!

Só tive mesmo de tratar o NPE no construtor.

Esse proxifier tem alguma diferença, para o que usa objenesis, digo em termos de funcionalidades, restrições [além do NPE no construtor?]

Lucas_Cavalcanti

as funcionalidades não mudam… o problema só são as desvantagens de cada abordagem…

uma instancia o objeto passando nulls para o construtor, podendo causar null pointer exceptions,
e a outra usa uma marotagem da VM pra instanciar objetos sem passar pelo construtor,
só que essa marotagem pode estar desabilitada…

Criado 3 de setembro de 2009
Ultima resposta 4 de set. de 2009
Respostas 12
Participantes 3