я реализовал работающее решение с использованием пользовательских @Interceptor
аннотацию в духе @Controller
аннотацию Спринга :
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Component
public @interface Interceptor {
String[] pathPatterns() default {};
String[] excludePathPatterns() default {};
}
Эта аннотация hould быть применены к HandlerInterceptor
типов следующим образом:
@Interceptor
public class BuildTimestampInterceptor extends HandlerInterceptorAdapter {
private final String buildTimestamp;
public BuildTimestampInterceptor(@Value("${build.timestamp}") String buildTimestamp) {
this.buildTimestamp = buildTimestamp;
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
req.setAttribute("buildTimestamp", buildTimestamp);
return true;
}
}
Наконец, класс процессора, InterceptorProcessor
, является Спринг бобов, который расширяет WebMvcConfigurerAdapter
и реализует BeanPostProcessor
для сканирования для пользовательских @Interceptor
аннотации и зарегистрировать бобы, имеющие, что anntation как HandlerInterceptor
s внутри переопределен addInterceptors
метода:
@Component
public class InterceptorProcessor extends WebMvcConfigurerAdapter implements BeanPostProcessor {
private final Map<HandlerInterceptor,Interceptor> interceptors = new HashMap<>();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
scanForInterceptorAnnotation(bean, beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String string) throws BeansException {
return bean;
}
protected void scanForInterceptorAnnotation(Object bean, String beanName) {
Optional<Interceptor> optionalInterceptor = getInterceptorAnnotation(bean.getClass());
if (optionalInterceptor.isPresent() && bean instanceof HandlerInterceptor) {
interceptors.put((HandlerInterceptor) bean, optionalInterceptor.get());
}
}
private Optional<Interceptor> getInterceptorAnnotation(Class cls) {
Annotation[] annotations = cls.getAnnotationsByType(Interceptor.class);
if (hasValue(annotations)) {
return Optional.of((Interceptor) annotations[0]);
}
return Optional.empty();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
interceptors.forEach((HandlerInterceptor key, Interceptor val) -> {
InterceptorRegistration registration = registry.addInterceptor(key);
if (hasValue(val.pathPatterns())) {
registration.addPathPatterns(val.pathPatterns());
}
if (hasValue(val.excludePathPatterns())) {
registration.excludePathPatterns(val.excludePathPatterns());
}
});
}
private static <T> boolean hasValue(T[] array) {
return array != null && array.length > 0;
}
}
Просто помните, чтобы сканирование приложения пружинный для этого процессора боб для того, чтобы он на самом деле зарегистрировать @Interceptor
с.Что-то вроде:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"org.my.controller", "org.my.utils.processor"})
public class WebConfig extends WebMvcConfigurerAdapter {...
Можете уточнить? Вы имеете в виду перехватчики Spring MVC или перехватчики AOP? Что вы подразумеваете под «проводкой»? – axtavt 2010-12-08 15:36:34
Возможно, вы захотите увидеть это http://karthikg.wordpress.com/2009/10/12/athandlerinterceptor-for-spring-mvc/ – ashishjmeshram 2011-04-26 13:37:27
Я знаю, что прошло несколько лет, когда вы задали этот вопрос, но @Markus Kreusch опубликовал правильный ответ для новой версии Spring MVC – 2013-04-25 14:13:27