当前位置: 首页 > 知识库问答 >
问题:

Spring Interceptor不在Spring Data REST URL中工作

冯哲彦
2023-03-14

我正在从事一个使用SpringDataREST和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数据REST(如/helloworld)未使用的任何URL发出HTTP请求时,拦截器会按预期工作,正如我看到的记录器输出一样

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

然而,当URL被Spring数据Rest所使用时,我的拦截器不被调用。这适用于所有URL,如 /api/{模型中的现有实体}

为什么我的拦截器没有调用Spring Data Rest URL?我可以做些什么来使我的拦截器适用于所有请求?

提前多谢了。

共有2个答案

郑声
2023-03-14

我只想在@AndrewP的答案中添加一些东西。。。

如果在项目中仅使用Spring REST Data,并且希望截取Spring Repository和@RepositoryRestController,则只需使用以下语法定义一个@Bean方法:

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

这样的方法必须声明在任何@Configuration注释类;这样的类不需要实现/扩展任何特殊的东西(例如,WebMvcConfigrerAdapter)...许多留档在网上暗示,但我认为它只适用于当你处理Spring MVC资源!

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

宰修能
2023-03-14

通过声明MappeInterceptor类型的bean并将其注入我的拦截器(它扩展了HandlerInterceptorAdapter),我的拦截器被SpringDataREST获取,现在可用于应用程序上的任何URL。

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

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    DBEditorTenantInterceptor dbEditorTenantInterceptor;

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

}

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

 类似资料:
  • 我试图让ESLint让我使用对象的Rest/传播。尽管我尽了最大努力,我还是得到了这个错误: 当我悬停在椭圆上时(<代码>...)用红色弯弯曲曲。 我的看起来像这样: 我确信prefs正在被阅读,因为规则、插件和样式指南正在按预期工作。 要启用对象rest/spread,是这里的关键(哈哈),它似乎对其他人有用。然而,它拒绝为我工作。我不知所措 更新:我使用的是Visual Studio代码v1.

  • 我用NodeJS和Socketio开发了聊天程序。然后我部署到Heroku服务器,发现SocketIO在Heroku中不工作。 我已经检查了Heroku的日志,但什么都没有。但奇怪的是,它在localhost环境中工作,而不是在Heroku环境中。我想端口设置有些问题。 [服务器端代码] “客户端代码” 第一次,我只是使用代码,它在Localhost env中工作得很好。但是在部署到heroku之

  • 我使用一个包在Flutter中,它可以在Android上正常工作,但是当在ios模拟器上运行我的项目时,我在控制台中收到错误。 当我运行时,我得到以下错误,由于内容长度,我删除了错误的一些重复部分。 我在上面的错误中找不到任何相关消息这是 这就是我与pusher的连接方式 但在我注释掉上述文件和<code>pusher_client:^2.0.0<code>中的<code>时。yaml然后运行<c

  • 错误:活动:自2018-04-09周一16:35:28 IST以来失败(结果:退出代码);进程:22654 ExecStart=/usr/sbin/nginx(代码=退出,状态=1/失败)Apr 09 16:35:28 localhost。localdomain systemd[1]:无法启动nginx HTTP和反向代理服务器。

  • 我从官方网站学习Angular 4,我通过ngModel学习了双向数据绑定部分。但是,只要我将[(ngModel)]添加到组件模板中,我的应用程序就会停止工作,即使FormsModule已导入模块中。ts文件。组件未加载 我正在使用Visual Studio代码<这是我的应用程序。组成部分ts 这是一个应用程序。单元ts AppComponent没有加载,只是显示 加载。。。

  • 我有一个视频流服务器,它能够使用rtp通过摄像头捕获视频帧。我的android mobile作为客户端,能够通过以下管道传输输出: udpsrc端口=5004!应用程序/x-rtp,时钟速率=90000,编码名称=(字符串)H264,有效负载=96!队列rtph264depay!H264解析!decodebin!自动视频接收器 但是,如果我用fpsdisplysink替换autoVideosink

  • 我正在使用Liquibase 3.3.2并尝试实现一个Web服务,该服务接受许多变更日志,根据上下文查找特定的数据源,并将该数据源与Liquibase变更日志一起使用以执行数据库更新。 我使用PostgreSQL作为数据库。 不知何故,来自webservice端的liquibase日志表明根本没有问题,似乎都在正确执行。但是,数据库中没有任何表,甚至没有Liquibase自己的锁/状态表。。 这是

  • 我有一个简单的属性转换实现,在这个实现中,我试图注入一个必须提供转换逻辑的对象,但是似乎不适合这种情况。转换器类看起来像这样: 当被触发时,它会抛出一个,因为属性没有从容器中初始化。为什么? 我使用的是Glassfish 4,在所有其他情况下,都可以正常工作。 不可能在转换器上使用CDI吗? 任何帮助都将不胜感激:) 我的问题的重点更多的是属性转换部分。我明白要让CDI工作,bean必须满足这里描