我目前正在编写某种框架,允许其他人为其编写 REST Controller 。当然,我希望那些“其他人”尽可能少地与我的代码中发生的事情进行交互。
具体来说,我想要并且需要访问请求数据(即
在请求由其余 Controller 处理之前的 RequestEntity
。在 Controller 处理请求之前“拦截”请求,然后才让 Controller 处理它。
考虑以下代码:
@RestController
@RequestMapping("/")
public class MyController {
@GetMapping("/")
@ResponseBody
public ResponseEntity<String> getSomething(RequestEntity requestEntity) {
MyClass.doStuffWithRequestEntity(requestEntity);
// ...
现在我需要的是调用 ExternalClass.doStuffWithRequestEntity(requestEntity);
而无需显式调用它。是否可以在某个类中调用某些方法(将 RequestEntity 传递给它!)而不必显式调用它?
此外,所述拦截器类应该创建并配置一个对象,然后该对象再次可供其余 Controller 使用。
我会想类似的事情
class RestController {
@RestController
@RequestMapping("/")
public class MyController {
@GetMapping("/")
@ResponseBody
public ResponseEntity<String> getSomething() {
MyClass x = MyClass.getInstanceCreatedByInterceptor();
}
}
}
和
class Interceptor {
public void doStuffWithRequestEntity(requestEntity) {
MyClass x = new MyClass();
x.fillObjectWithData();
}
}
之前被执行过。
这个想法是,每个(!)传入请求都会被解析,并且其内容会被解码,而其余 Controller 的程序员根本不必关心这一点。他们应该只通过/从 MyClass 实例访问数据。
有办法做到这一点吗?
最佳答案
Spring-boot 允许我们配置自定义拦截器。通常在 Spring Boot 应用程序中,所有内容都是自动配置的,在这种情况下,我们可以使用 WebMvcConfigurerAdapter
来自定义它。只需扩展 WebMvcConfigurerAdapter
并在此类中提供所需的配置即可。
记得添加@Configuration
注解,以便Spring在组件扫描期间拾取该类。
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
HandlerInterceptor customInjectedInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(...)
...
registry.addInterceptor(customInjectedInterceptor).addPathPatterns("/**");
}
}
这就是您通常向 Spring Boot 应用程序添加拦截器的方式。希望这可以帮助回答您的问题。
从 spring 5.x.x 或 spring-boot 2 开始,WebMvcConfigurerAdapter
被标记为已弃用。WebMvcConfigurer
接口(interface)(由抽象类 WebMvcConfigurerAdapter
),从 Spring 5 开始,包含其所有方法的默认实现。因此,抽象适配器类被标记为已弃用。如果您愿意,可以采用它,如下所示:
@Configuration
public WebConfig implements WebMvcConfigurer {
// ...
}
关于Spring Boot RestController : Intercept incoming requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852142/