Spring Interceptor无法在Spring Data REST URL中工作

问题描述 投票:5回答:2

我正在使用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发出HTTP请求时,例如/ helloworld,Interceptor按预期工作,因为我看到记录器输出

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

但是,当弹簧数据休息使用URL时,不会调用我的拦截器。这适用于所有网址,例如/ api / {模型中的现有实体}

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

非常感谢提前。

spring spring-mvc spring-boot spring-data-jpa spring-data-rest
2个回答
5
投票

通过声明一个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文档中找不到任何对此的引用。


0
投票

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

如果您在项目中仅使用Spring REST Data,并且想拦截Spring Repositories和@RepositoryRestControllers,则只需使用以下语法定义@Bean方法:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.