我正在使用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?我该怎么做才能让我的拦截器适用于所有请求?
提前多多感谢。
答案 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
...