interceptor

53 views
Skip to first unread message

Will

unread,
Aug 29, 2012, 3:30:35 PM8/29/12
to caelum-...@googlegroups.com
Boa tarde Pessoal,

Estou com um problema com um Interceptor.

Gostaria de interceptar URI para ao meu site, mas não todas, só quero interceptar URI que um usuário tem.

Para isso eu criei um metodo para buscarURI no banco, mas está interceptando todas as URI, se coloco por exemplo /login ele vai querer inteceptar, não quero isso quero que só interceptar /site/meu-site, por exemplo.

Eu não consegui entender direito o Interceptor.

O accepts ele irá decidir se vai interceptar ou não.
O intercept irá sempre inteceptar as requisições.


@Intercepts @RequestScoped
public class InterceptorURI implements Interceptor {
   
    private final UsuarioController usuarioController;
    private HttpServletRequest request;
   
    public InterceptorURI(UsuarioController usuarioController, HttpServletRequest request){
        this.usuarioController  = usuarioController;
        this.request             = request;
    }
   
   
    @Override
    public boolean accepts(ResourceMethod method) {
        Usuario statusURI =  usuarioController.BuscaURI(request.getRequestURI());
       
        System.out.println("**********" + request.getRequestURI());
       
       
        if(statusURI.equals(request.getRequestURI())){
            System.out.println("************ URI válida *************");
            return true;
        }
       
        System.out.println("********** URI Invalida *************");
       
        return false;
    }

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method,
            Object resourceInstance) throws InterceptionException {
       
        System.out.println("***************Interceptando "+ request.getRequestURI());
       
        stack.next(method, resourceInstance);
           
    }

}

public class UsuarioController {
public Usuario BuscaURI(String uri){
        return this.usuarioDAO.buscaURI(uri);
    }
}


public class UsuarioDAO {
public Usuario buscaURI(String uri) {
        try {
            String jpql = "select u from Usuario u where u.uri = uri";
            Query query = this.em.createQuery(jpql);
            query.setParameter("uri", uri);
            return (Usuario) query.getSingleResult();
           
        } catch (NoResultException e) {
            return null;
        }
       
    }
}




Lucas Cavalcanti

unread,
Aug 29, 2012, 3:55:29 PM8/29/12
to caelum-...@googlegroups.com
o método intercept só vai executar se o accepts retornar true... dá uma olhada se o accepts tá retornando o certo






--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/Js_jq-v0S40J.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.

Willian

unread,
Aug 29, 2012, 4:58:26 PM8/29/12
to caelum-...@googlegroups.com
Lucas,

O problema está na minha consulta, não está buscando corretamente pq o uri que vem do request está trazendo /Nome_do-site/nome-da-uri

E o que eu quero é só a URI, tenho que tratar isso, mas estou tentando fazer só um teste para ver se funciona mas no meu JPQL está dando erro.

public Usuario buscaURI(String uri) {
       
       // System.out.println("**************"+uri);
       
        try {
            String jpql = "select u from Usuario u where u.uri ='meu-site'";
            Query query = this.em.createQuery(jpql);
            query.setParameter("uri", "meu-site");

            return (Usuario) query.getSingleResult();
           
        } catch (NoResultException e) {
            return null;
        }
    }

Não consigo fazer isso, passar uma string no jpql ?

Abraços!




2012/8/29 Lucas Cavalcanti <lucasm...@gmail.com>

Lucas Cavalcanti

unread,
Aug 29, 2012, 5:36:38 PM8/29/12
to caelum-...@googlegroups.com
consegue.. mas vc tem que fazer:

where u.uri = :uri

pra poder fazer um setParameter("uri", qqercoisa);

2012/8/29 Willian <aquin...@gmail.com>

Lucas Cavalcanti

unread,
Aug 29, 2012, 5:37:36 PM8/29/12
to caelum-...@googlegroups.com
e pra tirar o context_path vc pode fazer:

String uri = request.getRequestURI().replaceFirst(request.getContextPath(), "");

2012/8/29 Lucas Cavalcanti <lucasm...@gmail.com>

Willian

unread,
Aug 30, 2012, 2:02:08 PM8/30/12
to caelum-...@googlegroups.com
Lucas,

Valeu cara era isso mesmo, reparei que estava fazendo uma coisa nada haver no meu DAO, passando o Usuario com tipo ao invez de ums String, mas tive que fazer um cast para String e está dando erro.

Porque isso está acontecendo quando o tipo é String e não ocorre com o tipo Usuario?

java.lang.ClassCastException: br.com.meuSite.admin.model.Usuario cannot be cast to java.lang.String
	br.com.meuSite.admin.dao.UsuarioDAO.buscaURI(UsuarioDAO.java:59)


Abraços!


Washington Botelho

unread,
Aug 30, 2012, 2:28:38 PM8/30/12
to caelum-...@googlegroups.com
Oi Willian,


br.com.meuSite.admin.model.Usuario cannot be cast to java.lang.String

O cast deveria ser para Usuário, não?

--
Washington Botelho

@wbotelhos
wbotelhos.com.br





2012/8/30 Willian <aquin...@gmail.com>

Willian

unread,
Aug 30, 2012, 2:33:15 PM8/30/12
to caelum-...@googlegroups.com
Então Botelhos eu achava isso também mas depois no meu Interceptor como vou comparar? Equals?

Está assim o meu Interceptor e o meu DAO.

public boolean accepts(ResourceMethod method) {

        String uri = request.getRequestURI().replaceFirst(request.getContextPath(), "");
   
        String buscaURI = usuarioController.BuscaURI(uri);
       
        if(uri == buscaURI){

            System.out.println("************ URI válida *************");
            return true;
        }
       
        System.out.println("********** URI Invalida *************");
        return false;
    }


public String buscaURI(String uri) {

       
        try {
            String jpql = "select u from Usuario u where u.uri = :uri";
            Query query = this.em.createQuery(jpql);
            query.setParameter("uri", uri);
            return (String) query.getSingleResult();

           
        } catch (NoResultException e) {
            return null;
        }
       
    }


Abraços!

Willian

unread,
Aug 30, 2012, 3:18:24 PM8/30/12
to caelum-...@googlegroups.com
Então pessoal,

Mudei para o tipo Usuario o meu metodo, faz a consulta blz sem problemas, mas agora estou em outro dilema.

O meu metodo que chama o meu modelo está com o @Path assim


@Resource
public class ModeloController {
   
    @Get @Path("/{usuario.uri}")
    public void modelo(){}

}


Nesse caso ele vai querer interceptar todas as URI do meu site e caindo no meu Interceptor.

Quando ele encontra a URI do banco redireciona corretamente, mas quando for qualquer outra URI ele da erro.

Não sei o que fazer. Alguma sugestão.



Ago 30, 2012 4:08:12 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: There are two rules that matches the uri '/login' with method GET: [[FixedMethodStrategy: /{usuario.uri}                                                    ModeloController.modelo()                                              [GET]], [FixedMethodStrategy: /login                                                            UsuarioController.login()                                              [GET]]] with same priority. Consider using @Path priority attribute.
    at br.com.caelum.vraptor.http.route.DefaultRouter.checkIfThereIsAnotherRoute(DefaultRouter.java:97)
    at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:88)
    at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:59)
    at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:66)
    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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
    at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
    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:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

Washington Botelho

unread,
Aug 30, 2012, 3:37:28 PM8/30/12
to caelum-...@googlegroups.com
Então Willian,

Tenta deixar essa sua URI mais específica, pois ela pega vários casos, veja o erro:


There are two rules that matches the uri '/login'

Diz ai que o seu path `@Get @Path("/{usuario.uri}")` também faz um match com /login, já que ele pega apenas uma palavra que pode ser "xpto" ou pode ser "login", como foi o caso.
Tenta usar algo como @Get("/usuario/{uri}"), assim o primeiro nome "/usuario", já deixa este path exclusivo não tendo conflitos.

* Veja que você pode dizer que é Get diretamente, não precisa das duas anotações. (:

Lucas Cavalcanti

unread,
Aug 30, 2012, 3:57:10 PM8/30/12
to caelum-...@googlegroups.com
O erro diz:
Consider using @Path priority attribute.

vc pode colocar no Path mais genérico a menor prioridade:
@Get @Path(value = "/{usuario.uri}", priority=Path.LOWEST)

2012/8/30 Washington Botelho <wbot...@gmail.com>

Willian

unread,
Aug 30, 2012, 4:21:53 PM8/30/12
to caelum-...@googlegroups.com
Botelhos,

Vou arrumar as minhas URI mesmo, vou deixar do jeito que vc falo, fica mais organizado.

Vou melhorar esse Interceptor também.

Muito obrigado a todos!!!!

Abraços!

Willian

unread,
Sep 6, 2012, 10:59:19 AM9/6/12
to caelum-...@googlegroups.com
Bom pessoal,

Arrumei o meu interceptor e coloquei até erro de 404 para páginas não existentes, fiz a busca no banco para pegar as informações do template, mas agora tenho uma dúvida.

Não quero que sempre que alguém acessar um site tenha que ficar buscando no banco as informações, isso vai gerar muito acesso ao banco e vai me ferrar depois.
Eu pensei em criar um XML, quando o usuário cadastrar as informações atualiza o XML,
e quando a página for acessada lê o XML já populado.

Já vi vários posts aqui sobre Json e acho que isso também pode me ajudar a fazer isso.

O que vocês acham? Alguém tem alguma ideia melhor para sugerir?

Abraços!

Bruno Fuster

unread,
Sep 6, 2012, 11:09:47 AM9/6/12
to caelum-...@googlegroups.com
A busca no banco seria usuarioController.BuscaURI(uri); ?

Você pode usar o redis pra isso e já fica com um cache ferrado em memoria pronto pra ser usado :) ou membase/memcached...ou ate mesmo EHCache com hibernate em 2nd nivel (acho que a apartir do 1.2 é distribuido)

mas eu ficaria com o redis :D
redistogo tem plano free pra brincar, mas o ideal é subir em uma maquina proxima da sua

[]s





2012/9/6 Willian <aquin...@gmail.com>



--
Bruno Fuster

Willian

unread,
Sep 6, 2012, 11:35:25 AM9/6/12
to caelum-...@googlegroups.com
Bruno,

Não, essa busca seria para ver se existe a URI, depois disso faço outra Busca, porque com esse URI tenho o ID do usuário, ai faço um busca com todas as informações do usuário, texto, imagens etc.

Usuario buscaTemplate = modeloController.infoTemplate(buscaURI.getId());

ai tenho esse objeto todo populado com as informações do banco.

Esses chace que você falo é feito com o Hibernate? Tem algum link de como fazer isso?

Vou procurar para ver se acho alguma coisa.

Uma coisa que reparei olhando quando eu faço essa busca é que o Hibernate faz a busca das Informações do template, só com a busca do uri, comentei a minha busca do infoTemplate para mostrar.

Sinceramente não entendi o porque, nem sei como explicar isso.

Quando faço a busca dda URI ele faz isso.

Busca a URI

Hibernate:
    select
        usuario0_.id_usuario as id1_0_,
        usuario0_.confirmaSenha as confirma2_0_,
        usuario0_.dataCadastro as dataCada3_0_,
        usuario0_.dataExpiracao as dataExpi4_0_,
        usuario0_.emailNoiva as emailNoiva0_,
        usuario0_.emailNoivo as emailNoivo0_,
        usuario0_.folder as folder0_,
        usuario0_.id_modelo as id15_0_,
        usuario0_.nomeNoiva as nomeNoiva0_,
        usuario0_.nomeNoivo as nomeNoivo0_,
        usuario0_.perfil as perfil0_,
        usuario0_.senha as senha0_,
        usuario0_.status as status0_,
        usuario0_.uri as uri0_,
        usuario0_.usuario as usuario0_
    from
        Usuario usuario0_
    where
        usuario0_.uri=? limit ?


Ai ele Busco altomaticamente o template com as informações só com a URI

Hibernate:
    select
        modelosite0_.id_modelo as id1_1_5_,
        modelosite0_.nomeModelo as nomeModelo1_5_,
        modelosite0_.publico as publico1_5_,
        paginas1_.ModeloSite_id_modelo as ModeloSite1_1_7_,
        pagina2_.id_pagina as paginas2_7_,
        pagina2_.id_pagina as id1_3_0_,
        pagina2_.id_cerimonia as id2_3_0_,
        pagina2_.id_festa as id3_3_0_,
        pagina2_.id_home as id4_3_0_,
        pagina2_.id_sobre as id5_3_0_,
        cerimonia3_.id_cerimonia as id1_4_1_,
        cerimonia3_.descricao as descricao4_1_,
        cerimonia3_.id_usuario as id3_4_1_,
        cerimonia3_.linkMap as linkMap4_1_,
        festa4_.id_festa as id1_5_2_,
        festa4_.descricao as descricao5_2_,
        festa4_.id_usuario as id3_5_2_,
        festa4_.linkMap as linkMap5_2_,
        home5_.id_home as id1_2_3_,
        home5_.descNoiva as descNoiva2_3_,
        home5_.descNoivo as descNoivo2_3_,
        home5_.descVideo as descVideo2_3_,
        home5_.fotoNoiva as fotoNoiva2_3_,
        home5_.fotoNoivo as fotoNoivo2_3_,
        home5_.id_usuario as id7_2_3_,
        home5_.video as video2_3_,
        sobre6_.id_sobre as id1_7_4_,
        sobre6_.descricao as descricao7_4_,
        sobre6_.id_usuario as id3_7_4_
    from
        ModeloSite modelosite0_
    left outer join
        ModeloSite_Pagina paginas1_
            on modelosite0_.id_modelo=paginas1_.ModeloSite_id_modelo
    left outer join
        Pagina pagina2_
            on paginas1_.paginas_id_pagina=pagina2_.id_pagina
    left outer join
        Cerimonia cerimonia3_
            on pagina2_.id_cerimonia=cerimonia3_.id_cerimonia
    left outer join
        Festa festa4_
            on pagina2_.id_festa=festa4_.id_festa
    left outer join
        Home home5_
            on pagina2_.id_home=home5_.id_home
    left outer join
        Sobre sobre6_
            on pagina2_.id_sobre=sobre6_.id_sobre
    where
        modelosite0_.id_modelo=?


Copiei e colei esse Select no mysql para ver e realmente traz as informações do banco do template desse usuário.


Valeu Bruno.

Bruno Fuster

unread,
Sep 6, 2012, 11:47:53 AM9/6/12
to caelum-...@googlegroups.com
Eh acho que o melhor é usar o EHCache mesmo então ou algo do tipo

segue tutorial




--
Bruno Fuster

Willian

unread,
Sep 6, 2012, 11:59:35 AM9/6/12
to caelum-...@googlegroups.com
Valeu Bruno,

Muito obrigado mesmo.

Abraços!

Rafael Ponte

unread,
Sep 6, 2012, 11:21:44 AM9/6/12
to caelum-...@googlegroups.com

Se estiver utilizando o Hibernate com certeza utilizar o (cache de segundo nivel + query cache) seria a soluçao mais simples.

Tem tambem o @Cache do Spring.

A soluçao com Redis ou Memcache tambem é uma boa.

Willian

unread,
Sep 10, 2012, 4:37:20 PM9/10/12
to caelum-...@googlegroups.com
Boa tarde Pessoal,

Pesquisei mas não encontrei, estou usando o EhCache já instalei mas como faço para saber se ele está funcionando?

No Jboos no Log aparece que está funcionando

  • 11:55:53,084 INFO  [SettingsFactory] Second-level cache: enabled  

Encontrei esse post no GUJ.

http://www.guj.com.br/java/205103-ehcache--jpa-nao-funciona


Alguém sabe como ver se está funcionando?

Abraços!

Bruno Fuster

unread,
Sep 10, 2012, 4:39:46 PM9/10/12
to caelum-...@googlegroups.com
Uma forma bem rapida/simples é habilitar o log de sql. No primeiro acesso deve logar a sql executada no banco, e no segundo não pois deveria estar no cache e não ir no banco.

[]s

2012/9/10 Willian <aquin...@gmail.com>



--
Bruno Fuster

Willian

unread,
Sep 10, 2012, 4:50:43 PM9/10/12
to caelum-...@googlegroups.com
Bruno,

Blz cara vou tentar aqui, estou usando o Mysql WorkBeanch fui em log mas não aperece nada porque é só log de erro.

Só mais uma pergunta (essa é besta)

Eu estou executando local na minha máquina, vai funcionar o cache? Acho que não né.

Abraços!

Rafael Ponte

unread,
Sep 10, 2012, 5:02:40 PM9/10/12
to caelum-...@googlegroups.com
Olá William,

Você pode seguir a dica do log comentada pelo Bruno, ou você pode utilizar o Hibernate Statistics para saber se suas consultas estão fazendo hit no cache ou no banco.

2012/9/10 Willian <aquin...@gmail.com>

Willian

unread,
Sep 10, 2012, 5:12:52 PM9/10/12
to caelum-...@googlegroups.com
Rafael,

Bom esse artigo da Blog da Caelum, estou lendo, valeu!

Bruno Fuster

unread,
Sep 10, 2012, 5:45:27 PM9/10/12
to caelum-...@googlegroups.com
Opa! vai funcionar na sua maquina sim :)



2012/9/10 Willian <aquin...@gmail.com>



--
Bruno Fuster

Reply all
Reply to author
Forward
0 new messages