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

时间:2017-10-26 11:24:57

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

我正在使用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 **********

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

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

提前多多感谢。

2 个答案:

答案 0 :(得分:5)

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

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

#include <stdio.h>

int     main(void)
{
    char *string;

    scanf("%s", string);
    printf("Hello,%s !", string);

    return 0;
}

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

答案 1 :(得分:0)

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

如果您在项目中仅使用 Spring REST数据,并且想要拦截Spring Repository和@RepositoryRestController,则只需定义一个@Bean具有以下语法的方法:

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

这种方法必须在任何@Configuration注释类中声明;并且此类不需要实现/扩展任何特殊的操作(例如WebMvcConfigurerAdapter)...网络上的许多文档都暗示了这一点,但是我认为它仅在您进行交易时适用与 Spring MVC Resources !!!

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