【发布时间】:2021-05-16 11:29:38
【问题描述】:
@Component
public class TestInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
System.out.println("afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("postHandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("preHandle");
return true;
}
}
和
@SpringBootConfiguration
public class AnnotationSecurityConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/api/**");
}
}
最后,使用@RepositoryRestController 将实体呈现为REST,如下所示:
@RepositoryRestResource(excerptProjection = UserSummaryProjection.class)
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
然后调用
curl -X GET https://localhost:8080/api/v1/users
但是没有调用拦截器。
因为 REST 资源是使用 @RepositoryRestController 管理 Spring Data Rest 的,所以不会调用拦截器。但是,如果我使用 @RestController 编写 REST 资源,它将起作用。
如何使拦截器与 @RepositoryRestController 一起工作?
【问题讨论】:
-
你试过用
@Component注解TestInterceptor吗? -
刚试过,一样的
-
如果
TestInterceptor被容器扫描和管理,那么你应该注入它而不是new TestInterceptor()。它是这样工作的吗?@Autowired TestInterceptor testInterceptor;和registry.addInterceptor(testInterceptor).addPathPatterns("/api/**"); -
刚试过自动接线,同样的事情
-
确保正在创建 testinterceptor bean 并将其注入到配置 bean 中?在
registry.addInterceptor...、assert testInterceptor != null;行之前?
标签: spring spring-boot spring-mvc spring-security spring-data-rest