我正在尝试在我的应用程序中配置拦截器,但我无法使其工作。
在我的应用程序配置类中,我已按以下方式配置:
@Configuration
@EnableWebMvc
public class AppContextConfiguration extends WebMvcConfigurerAdapter {
...
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
...
}
拦截器:
public class MyInterceptor extends HandlerInterceptorAdapter{
private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
logger.debug("MyInterceptor - PREHANDLE");
}
}
有人知道为什么没有被调用吗?
答案 0 :(得分:16)
我正在使用Spring Boot并且遇到了同样的问题,其中addInterceptors()
被调用来注册拦截器,但拦截器在请求期间从未触发过。然而,XML配置没有问题。
基本上,您不需要WebMvcConfigurerAdapter
课程。您只需要声明类型为@Bean
的{{1}}:
MappedInterceptor
答案 1 :(得分:4)
必须在标记<mvc:interceptors>
内的 spring context xml 配置文件中声明拦截器类。你做到了吗?
来自文档
注册应用于所有URL路径的拦截器的示例:
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
注册限制于特定网址路径的拦截器的示例:
<mvc:interceptors>
<mvc:interceptor>
<mapping path="/secure/*"/>
<bean class="org.example.SecurityInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
因此,您需要在 spring context xml 文件中配置MyInterceptor
类
答案 2 :(得分:1)
有人可以将Theos的答案标记为正确的答案吗?我遇到了一个使用i18n和Thymeleaf(带有布局拦截器)的Spring Boot应用程序正常运行的情况,只要该应用程序使用以下配置运行localhost:
65
将应用程序部署到Elasticbeanstalk实例后,两个拦截器都不再被触发。虽然添加一次。当我将设置更改为
foo
在所有环境下一切正常。添加addInterceptor的触发拦截器一定存在问题,它可能取决于用于调用请求的URL-我不知道。
感谢您的回答,Theo,如果其他人偶然发现了这个不错的功能,我只是想在这里添加。
答案 3 :(得分:0)
如果可能的话。使用这种方法:
<int-jpa:updating-outbound-gateway
request-channel="nativeQlChannel" auto-startup="true"
native-query="update Transactions t set t.transaction_Status = :transactionStatus where t.bank_Reference_Number = :bankReferenceNumber "
entity-manager="entityManager" persist-mode="PERSIST" reply-channel="nativeQlChannelOne"
use-payload-as-parameter-source="false">
而不是:
public class Application extends WebMvcConfigurerAdapter{
...
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
public @Override void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor());
}
}
因为第一个你可以使用注射功能(如@Autowired等...)
答案 4 :(得分:0)
也许您应该在存在主类的文件中添加componentscan批注。
@ComponentScan("package where the interceptor is placed.")
为我工作。
答案 5 :(得分:0)
这种方法对我有用
@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}