Continuar a requisição com Interceptor

Bom dia, pessoal!
Estou com uma dúvida no interceptor do spring.
Acredito ser uma dúvida bem simples, mas não estou conseguindo encontrar a resposta.
Procurei desde ontem aqui e em outros foruns, mas não achei nada específico.
Ainda assim, mesmo depois de tanta procurar, acredito estar perguntando algo que muitos já perguntaram.
Por isso, peço desculpas, caso já estejam cansados ler a mesma coisa.

É uma dúvida básica.
Para mim, um Interceptor serve para fazer algo antes da requisição atingir seu alvo (sinta-se a vontade para me corrigir, caso eu esteja errado).
No meu caso, chamo um controller, mas antes de chegar nesse controle, quero que um interceptor faça algo.
Então meu fluxo é:
Jsp (chamando o Controller) -> Interceptor - > Controller -> volta jsp
O meu problema é que ele chega no Interceptor, faz o que tem que fazer, mas fica por lá. A requisição não passa pelo controller.

Seguem meus trechos de código:

  • declaração do interceptor

<mvc:interceptors> <bean class="tarifador.interceptor.ValorPeriodoInterceptor" /> </mvc:interceptors>

  • chamada no jsp

var url = "${pageContext.request.contextPath}/relc/geralistaclientes?cliente="+ clienteId + "&dataDe=" + document.getElementById("dataDe").value + "&dataAte=" + document.getElementById("dataAte").value + "&valor=" + document.getElementById("valor").value; $("#lig").load(url);

  • método do interceptor

[code]
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {

    Annotation[] annotations = ((HandlerMethod) handler).getMethod().getAnnotations();

    for (Annotation annotation : annotations) {
        if (annotation.annotationType() == ValorPorPeriodo.class) {
            gravaValorDoPeriodo(request);
            break;
        }
    }

    return super.preHandle(request, response, handler);

}[/code]

Estou usando spring.

Muito obrigado.

Quando você retorna true no preHandle ele deveria continuar ou para o próximo interceptor, ou para o controller.

Qual método o teu interceptor herda? Tem que saber o que o super.preHandle está retornando.

Cara… eu até tentei colocar um return true; direto, mas também não adiantou.
Estou dando extends na HandlerInterceptorAdapter.

Segue o código na integra do interceptor:

[code]public class ValorPeriodoInterceptor extends HandlerInterceptorAdapter {

@Inject
private ValorPeriodoDao dao;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                         Object handler) throws Exception {

    Annotation[] annotations = ((HandlerMethod) handler).getMethod().getAnnotations();

    for (Annotation annotation : annotations) {
        if (annotation.annotationType() == ValorPorPeriodo.class) {
            gravaValorDoPeriodo(request);
            break;
        }
    }

    return super.preHandle(request, response, handler);

}

private void gravaValorDoPeriodo(HttpServletRequest request) {
    ValorPeriodo valorPeriodo = new ValorPeriodo(request.getParameter("valor"), request.getParameter("dataDe"),
            request.getParameter("dataAte"), Calendar.getInstance());
    dao.persist(valorPeriodo);
}

}[/code]

Anyone?

Deve ter alguma configuração errada em outro ponto…

Você declarou mvc:annotation-driven?

Se você remover o interceptor, ele acessa o teu controller normalmente?

Será que o método que tu executa no interceptor está terminando? Se tu simplesmente imprimir alguma coisa e retornar true ou super.preHandle, ao invés da lógica atual, ele funciona?

Não vi nada de errado com seu código…

Rapaz,

com relação à tag, todas referentes ao interceptor são:

[code]<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:annotation-driven />

mvc:interceptors

</mvc:interceptors>[/code]

comentei a tag mvc:interceptors e a requisição entrou no Controller normalmente.

O método executado no interceptor é:

@Transactional public void persist(ValorPeriodo valorPeriodo) { em.persist(valorPeriodo); }

Com relação ao retorno, eu não entendi muito bem.
Estou dando extends na HandlerInterceptorAdapter, então sou obrigado a implementar o preHandle retornando boolean.

Pensei em tirar a herança, pra testar o que você sugeriu (retirar o return), mas não saberia como fazer o interceptor saber que era pra executar o método.

Desculpa, mas eu estou recomecando com JAVA depois de muito tempo. hehehe
e é a primeira vez que vejo spring.

Obrigado aí pela atenção. :smiley:

Complicado :o

A herança tá correta, deveria funcionar. No caso, eu sugeri que, ao invés de tentar persistir a entidade no interceptor, apenas imprimisse uma mensagem qualquer, pra ver se tá funcionando.

Mas deve estar ocorrendo uma exceção que não tá aparecendo nos logs. Configura o log pra nível debug e vê no que dá.

abraço.

Cara.
Não pude responder antes.
Amanhã, quando eu chegar no trabalho, eu testo e posto o restultado.

Quanto ao “log em nível debug”, viajei.

Sou novato mesmo.
Menos de 1 mês mexendo com java =~~

[quote=Kura]Cara.
Não pude responder antes.
Amanhã, quando eu chegar no trabalho, eu testo e posto o restultado.

Quanto ao “log em nível debug”, viajei.

Sou novato mesmo.
Menos de 1 mês mexendo com java =~~
[/quote]

Tranquilo, aliás, suponho que tu já tenha bastante experiência com alguma outra linguagem, pq em 1 mês já tá estudando Spring, tá bem avançado. :smiley:

Se você usa eclipse, vai ver os logs na aba Console. Imprimir logs demais deixa a aplicação mais lenta, por isso, por padrão normalmente não se imprime todos os logs. Quando eu disse pra você usar o nível debug, é por que aí ele vai imprimir tudo, se tiver algum erro acontecendo, você vai ver.

Existem vários frameworks de log, tem que ver qual sua app usa. Possivelmente é o log4j. Aí, basta você encontrar o arquivo log4j.properties ou log4j.xml no seu projeto e alterar a configuração relativa ao spring para DEBUG.

Valeu, cara. Vou tomar como um elogio. huahuah
Na verdade, eu trabalhei com java durante 1 ano, mas faz tempo e na época eu não tinha nem noção de OO (nem quando saí).
Só que eu sempre gostei de java então mesmo trabalhando com vb3 e 6 (!!!), eu sempre procurei estudar e fazer cursos na caelum e tal.
mas só agora, que mudei de empresa, estou trabalhando com java

Cara!
Não entendi NADA!
Agora está passando pelo interceptor E pelo controller! :shock:
Achei que tinha funcionado pq eu comentei a parte que chama o método pra persistir, mas depois tirei o comentário e tentei… e funcionou! :shock:

quanto ao debug, agora eu entendi. obrigado pela explicação.
Pra esse projeto eu estou usando o IntelliJ pra testar a IDE e estou gostando mto, diga-se de passagem.
acho que é o log4j mesmo pq eu vejo esse nome aí de vez em quando, enquanto está compilando lol.
Porém, eu não estou achando o .properties… não sei se é pq estou usando maven e ele abstrai as configurações… o.O

[quote=Kura]Valeu, cara. Vou tomar como um elogio. huahuah
Na verdade, eu trabalhei com java durante 1 ano, mas faz tempo e na época eu não tinha nem noção de OO (nem quando saí).
Só que eu sempre gostei de java então mesmo trabalhando com vb3 e 6 (!!!), eu sempre procurei estudar e fazer cursos na caelum e tal.
mas só agora, que mudei de empresa, estou trabalhando com java

Cara!
Não entendi NADA!
Agora está passando pelo interceptor E pelo controller! :shock:
Achei que tinha funcionado pq eu comentei a parte que chama o método pra persistir, mas depois tirei o comentário e tentei… e funcionou! :shock:

quanto ao debug, agora eu entendi. obrigado pela explicação.
Pra esse projeto eu estou usando o IntelliJ pra testar a IDE e estou gostando mto, diga-se de passagem.
acho que é o log4j mesmo pq eu vejo esse nome aí de vez em quando, enquanto está compilando lol.
Porém, eu não estou achando o .properties… não sei se é pq estou usando maven e ele abstrai as configurações… o.O
[/quote]

hehe, tava muito estranho isso aí mesmo. As vezes tem que limpar o projeto e coisas do tipo pra tua alteração entrar em vigor. Você tava reiniciando o server antes?

No caso do log, com o maven normalmente se deixa este arquivo no diretório resources (src/main/resources). Mas o projeto funciona normalmente se não tiver este arquivo, você apenas não consegue configurar o log adequadamente. Veja este projeto de exemplo, do Spring:

https://src.springframework.org/svn/spring-samples/petcare/trunk/

No diretório src/main/resources tem o log4j.xml. Se você realmente tá usando o log4j (verifique no pom.xml!), basta copiá-lo e adaptar pra tua aplicação.

Sei lá, cara… Muito doido. hhuahuaha
Mas deve ter sido algo desse tipo.
Sim, eu estava reiniciando o server, mas não tinha tentado nenhum clean.

Vi que o que tem no Maven é o slf4j.

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.4</version> </dependency>

Não tem nenhum arquivo em main/src/resources, mas já entendi como funciona.

Muito obrigado por toda atenção!
Foi mto esclarecedor.

Abração!