想象我们有一个像这样的 Controller :
@RestController
@RequestMapping("/{parameter}")
public class MyController {
@ExceptionHandler(SomeException.class)
public Object handleSomeException() { /* handle */ }
@RequestMapping("/something")
public Object handleSomething(@PathVariable("parameter") String parameter) {
/* handle */
}
@RequestMapping("/somethingElse")
public Object handleSomethingElse(@PathVariable("parameter") String parameter) {
/* handle */
}
}
问题是,如何以与 @ExceptionHandler
类似的方式为该特定 Controller 实现一些常见的前/后处理?例如。我想在 Controller 中有一个方法,它在处理程序方法之前接收请求,但仅请求此特定 Controller 。
我知道 RequestBodyAdvice
和 ResponseBodyAdvice
接口(interface),但想要 Controller 本地的东西。
作为一个使用示例 - 我想在每个处理程序之前对公共(public) parameter
变量进行一些验证。
最佳答案
上面遗漏的答案是如何为特定 Controller 注册拦截器,可以按如下方式完成:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}
在 XML 中,相同:
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/admin/**"/>
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="org.example.SecurityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
关于java - Spring MVC @Controller 拦截自己的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43097915/