Spring MVC - Interceptor从未调用过

时间:2014-03-25 11:53:09

标签: java spring spring-mvc interceptor

我正在尝试在我的应用程序中配置拦截器,但我无法使其工作。

在我的应用程序配置类中,我已按以下方式配置:

@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");
    }
}

有人知道为什么没有被调用吗?

6 个答案:

答案 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());
  }
}