Suporte a pico e guice

55 views
Skip to first unread message

Otávio Scherer Garcia

unread,
Sep 25, 2010, 12:16:40 PM9/25/10
to caelum-vr...@googlegroups.com
Oi pessoal.

Sei que o suporte ao guice está em desenvolvimento ainda. Mas fiz uns
testes aqui em uma aplicação que estava rodando bem com o Spring, e
encontrei alguns erros que creio que possa ajudar vocês. Todos os testes
foram feitos rodando em glassfish v3 (JEE6).

Quando fiz deploy da aplicação e tentei autenticar no sistema deu esse erro.

org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException:
cob.web.security.UserSession has unsatisfied dependency: interface
javax.servlet.http.HttpServletRequest among unsatisfiable dependencies:
[[interface javax.servlet.http.HttpServletRequest]] where
org.picocontainer.DefaultPicoContainer@1ac9fc3:4<I<org.picocontainer.DefaultPicoContainer@1b56adc:1<I<org.picocontainer.DefaultPicoContainer@2cee54:79<|
was the leaf container being asked for dependencies.
at
org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:156)
at
org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:184)
at
org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
at
org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:229)
at
org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:66)
at
org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:92)
at
org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:905)
at
org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:664)
at
br.com.caelum.vraptor.ioc.pico.PicoComponentRegistry.createSessionContainer(PicoComponentRegistry.java:207)
at
br.com.caelum.vraptor.ioc.pico.PicoComponentRegistry.getSessionContainer(PicoComponentRegistry.java:175)
at
br.com.caelum.vraptor.ioc.pico.PicoComponentRegistry.provideRequestContainer(PicoComponentRegistry.java:147)
at
br.com.caelum.vraptor.ioc.pico.PicoProvider.provideForRequest(PicoProvider.java:177)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Depois que reiniciei o dominio deu então outro erro, e nenhum dado de
sessão aparece na tela.

INFO: PWC2785: Cannot serialize session attribute
br.com.caelum.vraptor.ioc.pico.PicoComponentRegistry.session for session
98a62edb20e01076d32fb57705ef
java.io.NotSerializableException:
org.apache.catalina.session.StandardSessionFacade
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)


Rodando com o guice não há erro algum. Porém notei que todos os
componentes @SessionScoped não aparecem na tela, ou seja, não estão
sendo exportados para o jSP para que eu possa imprimir via
${algumaCoisa}. Notei que se eu pegar esse @SessionScoped e adicionar
manualmente via result.include no request eu consigo pega-lo no JSP.

Se eu for encontrando mais alguma coisa nos meus testes vou reportando aqui.

Abraços


Lucas Cavalcanti

unread,
Sep 25, 2010, 12:26:01 PM9/25/10
to caelum-vr...@googlegroups.com
Olá =)

org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: cob.web.security.UserSession has unsatisfied dependency: interface javax.servlet.http.HttpServletRequest among unsatisfiable dependencies: [[interface javax.servlet.http.HttpServletRequest]] where org.picocontainer.DefaultPicoContainer@1ac9fc3:4<I<org.picocontainer.DefaultPicoContainer@1b56adc:1<I<org.picocontainer.DefaultPicoContainer@2cee54:79<| was the leaf container being asked for dependencies.
parece um problema com o pico mesmo... cria uma issue por favor?
 
INFO: PWC2785: Cannot serialize session attribute br.com.caelum.vraptor.ioc.pico.PicoComponentRegistry.session for session 98a62edb20e01076d32fb57705ef
java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade
   at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
   at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
   at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
Vc pode ignorar esse erro... acontece qdo vc desliga o servidor ele tenta serializar o que está na sessão, pra deserializar no próximo
start e voltar no estado q tava antes.. mas isso não funciona se vc coloca algo q não é serializável na sessão... de qqer forma isso
não atrapalha o funcionamento da aplicação
 
Rodando com o guice não há erro algum. Porém notei que todos os componentes @SessionScoped não aparecem na tela, ou seja, não estão sendo exportados para o jSP para que eu possa imprimir via ${algumaCoisa}. Notei que se eu pegar esse @SessionScoped e adicionar manualmente via result.include no request eu consigo pega-lo no JSP.
isso não é uma feature do VRaptor... é o jeito que o Spring gerencia os componentes sessionScoped...
do jeito que a gente implementou o session scope isso deveria estar funcionando... vou dar uma olhada
issue plz?

Muito obrigado!
Abraços
 

Se eu for encontrando mais alguma coisa nos meus testes vou reportando aqui.

Abraços


--
You received this message because you are subscribed to the Google Groups "caelum-vraptor-dev" group.
To post to this group, send email to caelum-vr...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor-dev?hl=en.


Sérgio Lopes

unread,
Sep 25, 2010, 5:41:21 PM9/25/10
to caelum-vr...@googlegroups.com
Eu uso PicoContainer aqui e injeto HttpServletRequest sem problema algum.
Pela stacktrace do erro me parece que você está injetando request em algum component SessionScoped... seria isso?

Request e response só podem ser injetados em componentes RequestScoped. Se for isso mesmo, não é um bug do VRaptor

Abraços


2010/9/25 Lucas Cavalcanti <lucasm...@gmail.com>

Otávio Scherer Garcia

unread,
Sep 25, 2010, 7:57:50 PM9/25/10
to caelum-vr...@googlegroups.com
Oi Sérgio.

Tenho um UserSession (pojo session-scoped) que guarda as informações do usuário autenticado. Realmente no construtor eu tenho um request que é injetado para que eu possa pegar quem está autenticado assim:

    public UserSession(HttpServletRequest request) {
        email = request.getUserPrincipal().getName();
    }

Engraçado que no Spring isso funciona, hehe. Eu apenas injeto para pegar alguma informação mas não sejo a fazer set desse request. Outra coisa é que isso aconteceu apenas uma vez, quando eu fiz um deploy normal. Quando eu fiz um stop/start no glassfish tudo voltou ao normal. Ou seja, voltou a funcionar. De qualquer forma vou pensar em uma abordagem melhor, já que esse request me parece mesmo cheirar mal. =)

A única coisa que não está funcionando é pegar objetos session-scoped no JSP. Os objetos application-scoped e request-scoped funcionam normalmente. Vou investigar melhor isso e reporto problemas.

Abraços

davisnog

unread,
Oct 15, 2010, 8:28:44 AM10/15/10
to caelum-vraptor-dev
> Rodando com o guice não há erro algum. Porém notei que todos os componentes
> @SessionScoped não aparecem na tela, ou seja, não estão sendo exportados
> para o jSP para que eu possa imprimir via ${algumaCoisa}. Notei que se eu
> pegar esse @SessionScoped e adicionar manualmente via result.include no
> request eu consigo pega-lo no JSP.

Não sei se isso já resolvido, mais eu estou fazendo uns teste no GAE,
e esta acontecendo a mesma coisa, os objetos @SessionScoped não
consigo pegar no jsp.

Estou usando a versão 3.2 do VRaptor com o guice.

Lucas Cavalcanti

unread,
Oct 15, 2010, 9:57:58 AM10/15/10
to caelum-vr...@googlegroups.com
o guice não faz essa exportação automaticamente... por enquanto vc vai precisar fazer
isso na mão (por exemplo no construtor receber um HttpSession e fazer um session.setAttribute("nome", this); )

no spring funciona pq o spring implementa o session scope colocando atributos na sessão com os nomes
simples das classes. É uma feature acidental do VRaptor.

tem uma issue registrada pra isso já:

outro workaround seria fazer um interceptor, que itera por todos os atributos da sessão, e pegar
todos os que comecem com [Key e recolocá-los na sessao com o nome da classe.

[]'s


2010/10/15 davisnog <davi...@gmail.com>

davisnog

unread,
Oct 15, 2010, 4:14:01 PM10/15/10
to caelum-vraptor-dev
Eu até troquei o guice pelo PicoContainer, e também não funciona.
Mais de qualquer forma, esta aqui pra registrar.

Acho que a primeira solução que vc colocou acaba sendo a mais
simples(por enquanto).

On 15 out, 10:57, Lucas Cavalcanti <lucasmrtu...@gmail.com> wrote:
> o guice não faz essa exportação automaticamente... por enquanto vc vai
> precisar fazer
> isso na mão (por exemplo no construtor receber um HttpSession e fazer um
> session.setAttribute("nome", this); )
>
> no spring funciona pq o spring implementa o session scope colocando
> atributos na sessão com os nomes
> simples das classes. É uma feature acidental do VRaptor.
>
> tem uma issue registrada pra isso já:http://github.com/caelum/vraptor/issues/#issue/259
>
> outro workaround seria fazer um interceptor, que itera por todos os
> atributos da sessão, e pegar
> todos os que comecem com [Key e recolocá-los na sessao com o nome da classe.
>
> []'s
>
> 2010/10/15 davisnog <davis...@gmail.com>
>
>
>
> > > Rodando com o guice não há erro algum. Porém notei que todos os
> > componentes
> > > @SessionScoped não aparecem na tela, ou seja, não estão sendo exportados
> > > para o jSP para que eu possa imprimir via ${algumaCoisa}. Notei que se eu
> > > pegar esse @SessionScoped e adicionar manualmente via result.include no
> > > request eu consigo pega-lo no JSP.
>
> > Não sei se isso já resolvido, mais eu estou fazendo uns teste no GAE,
> > e esta acontecendo a mesma coisa, os objetos @SessionScoped não
> > consigo pegar no jsp.
>
> > Estou usando a versão 3.2 do VRaptor com o guice.
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "caelum-vraptor-dev" group.
> > To post to this group, send email to caelum-vr...@googlegroups.com.
> > To unsubscribe from this group, send email to
> > caelum-vraptor-...@googlegroups.com<caelum-vraptor-dev%2Bunsubs cr...@googlegroups.com>
> > .

davisnog

unread,
Oct 15, 2010, 4:20:10 PM10/15/10
to caelum-vraptor-dev
O workaround que eu tinha feito, já que eu tenho um interceptor para
controle de usuário eu pego o usuario e seto no
result.include("meuObjeto", meuObjeto);

Outra coisa, não sei o ValidationMessage, utiliza os mesmo recursos de
result.include, mais ainda nos testes que eu fiz abaixo tive que fazer
outra gambi, ou tem uma forma que eu não saiba:

if(emailJaExistente){
validator.add(new ValidationMessage("mensagem","Usuário já
cadastrado para esse email!"));
validator.onErrorUsePageOf(this).usuarioEmpresa();
}

Nesse caso ${mensagem} não aparece nada no jsp.

Lucas Cavalcanti

unread,
Oct 15, 2010, 4:20:04 PM10/15/10
to caelum-vr...@googlegroups.com
Isso nunca funcionou no Pico mesmo... como eu disse não era uma feature do VRaptor, era uma feature do Spring.


2010/10/15 davisnog <davi...@gmail.com>
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.

Lucas Cavalcanti

unread,
Oct 15, 2010, 4:26:18 PM10/15/10
to caelum-vr...@googlegroups.com
o jeito de fazer não é assim...

é iterando em ${errors}, que tem um ${error.category} e ${error.message}
http://vraptor.caelum.com.br/documentacao/validacao/

2010/10/15 davisnog <davi...@gmail.com>
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.

Otávio Scherer Garcia

unread,
Oct 16, 2010, 11:11:42 AM10/16/10
to caelum-vr...@googlegroups.com
Outro dia quando migrei para o Guice tive de fazer alguns ajustes, pois todos os objetos eu fazia algo como ${userSession.name}. Penso que o ideal seria padronizar os comportamentos, independente se o nome da variável no JSP seja userSession ou meu.pacote.userSession. O importante é padronizar.

O problema de mudar o Spring e Pico é a retro compatibilidade.

Outra coisa que notei no guice que tudo vai parar no request. Os objetos anotados como sessionScoped não deveriam ir para a session?

Abraços

Lucas Cavalcanti

unread,
Oct 16, 2010, 4:36:15 PM10/16/10
to caelum-vr...@googlegroups.com
onde vc viu que os sessionScopes vão pro request? na class SessionCustomScope?

2010/10/16 Otávio Scherer Garcia <ota...@otavio.com.br>

Otávio Scherer Garcia

unread,
Oct 16, 2010, 6:58:51 PM10/16/10
to caelum-vr...@googlegroups.com
Fiz algo assim:

Enumeration<String> names = request.getAttributeNames();
while(names.hasMoreElements()) {
String v = request.getAttribute(name);
System.out.println(name + " >> " + v);

Lucas Cavalcanti

unread,
Oct 16, 2010, 10:34:30 PM10/16/10
to caelum-vr...@googlegroups.com
E apareceu um monte de [Key blah blah blah], certo?
o que deveria estar acontecendo é:
- tudo que é request scoped, é guardado como um atributo de request
- tudo que é session scoped é guardado como um atributo de session
- tudo que é application scoped é singleton

2010/10/16 Otávio Scherer Garcia <ota...@otavio.com.br>
Fiz algo assim:

davisnog

unread,
Oct 17, 2010, 10:48:25 AM10/17/10
to caelum-vraptor-dev
Ah bom, entãoo é isso, estava fazendo errado.

Valeu Lucas.

On 15 out, 18:26, Lucas Cavalcanti <lucasmrtu...@gmail.com> wrote:
> o jeito de fazer não é assim...
>
> é iterando em ${errors}, que tem um ${error.category} e ${error.message}http://vraptor.caelum.com.br/documentacao/validacao/
>
> 2010/10/15 davisnog <davis...@gmail.com>
> > > > > caelum-vraptor-...@googlegroups.com<caelum-vraptor-dev%2Bunsu...@googlegroups.com><caelum-vraptor-dev%2Bunsubs
> > cr...@googlegroups.com>
> > > > > .
> > > > > For more options, visit this group at
> > > > >http://groups.google.com/group/caelum-vraptor-dev?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "caelum-vraptor-dev" group.
> > To post to this group, send email to caelum-vr...@googlegroups.com.
> > To unsubscribe from this group, send email to
> > caelum-vraptor-...@googlegroups.com<caelum-vraptor-dev%2Bunsu...@googlegroups.com>

Otávio Scherer Garcia

unread,
Oct 25, 2010, 7:32:36 PM10/25/10
to caelum-vr...@googlegroups.com
Mesmo o suporte ao guice estando em beta, atualizei uma aplicação minha e rolou tudo bem com a última atualização do Lucas que resolvia o problema dos componentes duplicados.

Como vocês já sabem, é uma aplicação bem grande que está rodando em Glassfish 3.1_b25 com cluster/load balance. Fiquei mesmo impressionado pela velocidade do guice, e como eu disse pro Lucas outro dia: guice à jato. Confesso que não usei nenhuma ferramenta para testar a velocidade, mas a impressão que eu tenho é que o acesso está praticamente instantâneo.

Parabéns pessoal.

Caio Filipini

unread,
Oct 25, 2010, 8:01:24 PM10/25/10
to caelum-vr...@googlegroups.com
Também atualizei uma aplicação em produção pra última versão com suporte a Guice e a melhora de performance foi absurda. :)

[]s
Caio.





2010/10/25 Otávio Scherer Garcia <ota...@otavio.com.br>
Mesmo o suporte ao guice estando em beta, atualizei uma aplicação minha e rolou tudo bem com a última atualização do Lucas que resolvia o problema dos componentes duplicados.

Como vocês já sabem, é uma aplicação bem grande que está rodando em Glassfish 3.1_b25 com cluster/load balance. Fiquei mesmo impressionado pela velocidade do guice, e como eu disse pro Lucas outro dia: guice à jato. Confesso que não usei nenhuma ferramenta para testar a velocidade, mas a impressão que eu tenho é que o acesso está praticamente instantâneo.

Parabéns pessoal.

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor-dev" group.
To post to this group, send email to caelum-vr...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.

Otávio Scherer Garcia

unread,
Oct 25, 2010, 8:14:27 PM10/25/10
to caelum-vr...@googlegroups.com
O scan estático já foi implementado?

Lucas Cavalcanti

unread,
Oct 25, 2010, 10:37:50 PM10/25/10
to caelum-vr...@googlegroups.com
está sim, só rodar essa classe:
br.com.caelum.vraptor.scan.VRaptorStaticScanning

java -cp vraptor-3.2.0.jar br.com.caelum.vraptor.scan.VRaptorStaticScanning

na pasta do seu projeto
Reply all
Reply to author
Forward
0 new messages