VRaptor 3 - ordem de execução dos interceptors

8 respostas
galmeida

Procurei nas docs mas não encontrei, existe alguma forma de garantir a ordem de execução dos interceptors?

obrigado,
galmeida

8 Respostas

Lucas_Cavalcanti

Sim existe

cria um cara que implementa InterceptorSequence e anota ele com @Intercepts

e tira o @Intercepts dos interceptors que estiverem dentro da stack

[]'s

galmeida

não funciou, acho que quando eu tiro o @Intercepts dos interceptors eles nao vao para o container, devo colocar alguma outra anotação neles?

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.directtalk.capim.core.vr.ErrorInterceptor] is defined: no bean for this type registered

br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:194)

br.com.directtalk.capim.core.vr.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:45)

br.com.caelum.vraptor.interceptor.DefaultInterceptorRegistry.interceptorsFor(DefaultInterceptorRegistry.java:56)

br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:54)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)

br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)

br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)

br.com.directtalk.capim.core.vr.spring.SpringProvider.provideForRequest(SpringProvider.java:41)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)

org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
Lucas_Cavalcanti

coloca @Component em cima deles

galmeida

Obrigado Lucas,
funcionou, apesar de que ele se comportou da forma contraria do que eu esperava

@Intercepts
@RequestScoped
public class CapimInterceptors implements InterceptorSequence {

    @SuppressWarnings("unchecked")
    @Override
    public Class<? extends Interceptor>[] getSequence() {
        return new Class[]{ SegundoFiltro.class, PrimeiroFiltro.class, };
    }
}

mais uma pergunta, o @RequestScoped continua no filtro, certo?

Obrigado,
galmeida

Lucas_Cavalcanti

por padrão é request scoped…

então… o vraptor tá executando os interceptors na ordem inversa dos que estão retornados no getSequence?

galmeida

exato

Lucas_Cavalcanti

registrei o bug… mas é provavel que se você estiver usando a lógica do interceptor depois do stack.next, ele execute ao inverso mesmo…

galmeida

verdade, se a logica estivesse depois do stack.next() ela seria executada ao contrario, mas nao foi esse o caso, a lógica estava antes.

galmeida

Criado 26 de agosto de 2009
Ultima resposta 27 de ago. de 2009
Respostas 8
Participantes 2