Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Sobre o HandlerInterceptor

Eu sei que o curso não aborda o tema, mas achei muito interessante o conceito de poder rodar interceptadores (como o preHandle, por exemplo) antes de de fato chamarmos os controladores.

O meu problema está em como o Spring Boot lida com o registro desses Intercepters, fazendo com que ele seja dependente do Path do endpoint, o que não acho muito conviniente.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MeuInterceptor())
                .addPathPatterns("/**"); // Você pode configurar padrões de caminho para determinar quais requisições serão interceptadas.
    }
}

Existe uma outra forma de fazer os Interceptors só serem usados em classes (ou métodos) específicos?

Eu gostaria de algo no estilo do Quarkus (que vi um pouco por cima) em que ele usa anotações nos controles onde o Interceptador deve ser usado.

Agradeço a ajuda desde já, e espero que não esteja abusando muito do fórum! :)

2 respostas
solução!

Olá, João! Sua pergunta é muito pertinente e não é nenhum abuso, pode ficar tranquilo!

No Spring Boot, o registro dos interceptadores é feito através do método addInterceptors do WebMvcConfigurer, como você bem mostrou no seu exemplo. Acredito que você já tenha percebido que o método addPathPatterns é utilizado para determinar quais requisições serão interceptadas, baseando-se no caminho do endpoint.

Agora, respondendo à sua pergunta: no Spring Boot, não há uma maneira direta de anotar classes ou métodos específicos para serem interceptados, como ocorre no Quarkus. A abordagem do Spring é mais baseada em caminhos de URL.

No entanto, existe uma forma de contornar isso. Você pode definir um padrão de caminho no addPathPatterns que corresponda apenas aos métodos ou classes que você deseja interceptar. Por exemplo, se você tem um controlador chamado MeuControlador e quer que apenas ele seja interceptado, você pode fazer algo assim:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MeuInterceptor())
            .addPathPatterns("/meuControlador/**"); // Apenas requisições para /meuControlador serão interceptadas
}

Outra abordagem seria verificar dentro do seu HandlerInterceptor se o método ou a classe atual possui uma anotação específica. Por exemplo:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (handler instanceof HandlerMethod) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        MinhaAnotacao minhaAnotacao = handlerMethod.getMethodAnnotation(MinhaAnotacao.class);
        if (minhaAnotacao != null) {
            // O método atual possui a anotação @MinhaAnotacao, então faça algo...
        }
    }
    return true;
}

Essas são algumas alternativas que você pode explorar. Lembre-se, cada abordagem tem suas vantagens e desvantagens, e a melhor escolha depende do seu caso específico.

Espero ter ajudado e bons estudos!

A segunda abordagem me pareceu muito boa pro meu problema em especifico! Muito obrigado professor, ótima explicação!