【问题标题】:Spring Interceptor not working in Spring Data REST URLsSpring 拦截器在 Spring Data REST URL 中不起作用
【发布时间】:2018-04-07 18:15:07
【问题描述】:

我正在使用 Spring Data Rest 和 JPA 开发一个项目,并且我正在尝试配置 HTTP 拦截器。根据参考文档, 在Spring Web MVC Docs - Handler Mapping Interceptor 中可用,我创建了一个扩展 HandlerInterceptorAdapter 的组件,如下所示:

@Component
public class DBEditorTenantInterceptor extends HandlerInterceptorAdapter {

    Logger logger = LoggerFactory.getLogger(DBEditorTenantInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
         logger.debug("********** INTERCEPTION SUCCESSFUL **********");
         return true;
    }
}

然后,通过扩展 WebMvcConfig 注册拦截器(如Spring Web MVC Docs - Config Interceptors中所述

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    DBEditorTenantInterceptor dbEditorTenantInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(dbEditorTenantInterceptor)
         .addPathPatterns("/**");
    }

}

当我向 Spring Data REST 未使用的任何 URL(例如 /helloworld)发出 HTTP 请求时,拦截器按预期工作,因为我看到了记录器输出

017-10-26 13:16:24.689 DEBUG 17012 --- [p-nio-80-exec-4] c.c.v.d.DBEditorTenantInterceptor        : ********** INTERCEPTION SUCCESSFUL **********

但是,当spring data rest使用URL时,我的拦截器没有被调用。这适用于所有 URL,例如 /api/{existing entity in model}

为什么没有为 Spring Data Rest URL 调用我的拦截器?我该怎么做才能使我的拦截器适用于所有请求?

提前非常感谢。

【问题讨论】:

标签: spring spring-mvc spring-boot spring-data-jpa spring-data-rest


【解决方案1】:

通过声明一个 MappedInterceptor 类型的 bean 并用我的拦截器注入它 - 它扩展了 HandlerInterceptorAdapter,我的拦截器被 Spring Data Rest 拾取,现在适用于应用程序上的任何 URL。

这转化为以下实现(替换我原来问题中的那个):

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    DBEditorTenantInterceptor dbEditorTenantInterceptor;

    @Bean
    public MappedInterceptor dbEditorTenantInterceptor() {
        return new MappedInterceptor(new String[]{"/**"}, dbEditorTenantInterceptor);
    }

}

不幸的是,我在 Spring 文档中找不到任何对此的引用。

【讨论】:

    【解决方案2】:

    我只想在@AndrewP 的answer 中添加一些内容...

    如果您在项目中仅使用 Spring REST 数据,并且想要拦截 Spring Repositories 和 @RepositoryRestControllers,则只需定义一个 @Bean 方法,其内容如下语法:

    @Bean
    public MappedInterceptor someMethodName() {
        return new MappedInterceptor(
            null,  // => maps to any repository
            new YourInterceptorImpl()
        );
    }
    

    这样的方法必须在任何@Configuration注解的类中声明;并且这样的类不需要实现/扩展任何特殊的东西(例如,WebMvcConfigurerAdapter)......网络上的许多文档都暗示了这一点,但我认为它只适用于您处理 Spring MVC 资源!!!

    拦截器实现必须要么实现HandlerInterceptor要么扩展HandlerInterceptorAdapter...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 2021-11-05
      • 2021-05-15
      • 2018-08-09
      • 2014-11-27
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多