2013-07-10 5 views
10

In un intercettore Primavera-MVC voglio accedere al metodo di controllo del gestoreIn un intercettore Spring-mvc, come posso accedere al metodo del controller del gestore?

public class CustomInterceptor implements HandlerInterceptor { 
    public boolean preHandle(
     HttpServletRequest request,HttpServletResponse response, 
      Object handler) { 

     log.info(handler.getClass().getName()); //access to the controller class 
     //I want to have the controller method 
     ... 
     return true; 
    } 
    ... 
} 

ho trovato:

how-to-get-controller-method-name-in-spring-interceptor-prehandle-method

Ma funziona solo in giro. Voglio che il nome del metodo acceda all'annotazione.

risposta

16

È possibile trasmettere lo Object handler a HandlerMethod.

HandlerMethod method = (HandlerMethod) handler; 

Nota tuttavia che l'argomento handler passato a preHandle non è sempre una HandlerMethod (attenti con ClassCastException). HandlerMethod ha poi metodi che è possibile utilizzare per ottenere le annotazioni, ecc

+1

@Reimeus Assolutamente, a meno che tu non sappia che hai solo metodi di gestione. Ad esempio, se l'app ha solo '@ Controller' per gestire le richieste, allora hai solo le istanze di' HandlerMethod'. –

+0

grazie per l'aiuto =) – Troncador

9

HandlerInterceptors fornirà solo l'accesso al HandlerMethod SE aver registrato i intercettori in questo modo:

@EnableWebMvc 
@Configuration 
public class InterceptorRegistry extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry registry) { 
     registry.addInterceptor(new InternalAccessInterceptor()); 
     registry.addInterceptor(new AuthorizationInterceptor()); 
    } 

} 

In tutti gli altri casi, l'oggetto gestore punterà al controller. La maggior parte della documentazione sul web sembrava aver perso questo punto sottile.

+1

Ma perché è così? Potresti fornire alcune informazioni sul perché non funziona dichiarandolo all'interno del file spring.xml con '' '' – jmattheis