Как я могу найти метод, вызываемый в обработчике из Spring HandlerInterceptor? - PullRequest
6 голосов
/ 03 сентября 2011

У меня есть Spring HandlerInterceptor, который перехватывает URL-адреса внешнего интерфейса в моем приложении (/ app / *). Я хочу определить, какой метод действия в обработчике должен быть вызван из HandlerInterceptor. Есть ли способ найти это, мне нужно ввести что-то в перехватчик, который может искать это на основе запрошенного пути?

Перехватчик выглядит так:

public class PageCacheInterceptor implements HandlerInterceptor {...}

Отображается так:

<mvc:interceptors>
    <bean class="com.example.web.interceptors.PageCacheInterceptor" />
</mvc:interceptors>

Фон (потому что я знаю, что вы спросите!). Я добавляю простое кэширование страниц в свое приложение и хочу использовать аннотацию типа @Cacheable для каждого подходящего метода в контроллере. Затем перехватчик может определить, следует ли кэшировать ответ на основе действия, которое его создало.

Например:

@RequestMapping(value = "", method = RequestMethod.GET)
@Cacheable(events={Events.NEW_ORDER,Events.NEW_STAT})
public String home(Model model) {...}

События, которые приводят к тому, что кеш становится недействительным. Например, действие / widget / list приведет к тому, что его кэшированный ответ будет аннулирован новым сохраненным виджетом.

Редактировать: я обновился до последней версии Spring 3.1 M2, так как в этом сообщении в блоге намекает на нужные мне функции, но не ясно, потребуется ли внедрение этих новых классов или подклассов. Кто-нибудь использовал их, чтобы получить метод HandlerMethod в перехватчике?

Ответы [ 2 ]

8 голосов
/ 04 сентября 2011

Хорошо, поэтому решение было действительно очень простым:

1) Обновление до Spring 3.1

2) RTFM (правильно)

Например, HandlerInterceptor может привести обработчик из Object к HandlerMethod и получить доступ к методу целевого контроллера, его аннотациям и т. Д.

3) Привести объект обработчика к HandlerMethod в Перехватчике.

Тогда вы можете делать такие вещи:

    HandlerMethod method = (HandlerMethod) handler;
    Cacheable methodAnnotation = method.getMethodAnnotation(Cacheable.class);
    if (methodAnnotation != null) {
        System.out.println("cacheable request");
    }
0 голосов
/ 05 ноября 2015
@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
System.out.println("Pre-handle"); 
HandlerMethod hm=(HandlerMethod)handler; 
Method method=hm.getMethod(); if(method.getDeclaringClass().isAnnotationPresent(Controller.class)){
 if(method.isAnnotationPresent(ApplicationAudit.class))
{ 
System.out.println(method.getAnnotation(ApplicationAudit.class).value()); 
request.setAttribute("STARTTIME",System.currentTimemillis());
 }
} 
return true; 
} 

В этом сообщении есть больше деталей, надеюсь, это поможет http://www.myjavarecipes.com/spring-profilingaudit-using-mvc-filters/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...