【问题标题】:How to make multiple Spring HandlerInterceptors execute in a specific order如何使多个 Spring HandlerInterceptor 以特定顺序执行
【发布时间】:2021-10-25 02:42:35
【问题描述】:

我目前正在开发一个 Spring Boot 项目。我依赖于一个库项目,该库项目有一个拦截器(LibraryProjectInterceptor.java)和一个public class LibraryProjectConfig implements WebMvcConfigurer,并覆盖addInterceptors() 方法以将LibraryProjectInterceptor 添加到InterceptorRegistry。在我添加此库项目依赖项的实际项目中,我创建了一个拦截器(ActualProjectInterceptor),需要在执行LibraryProjectInterceptor 之后执行。我尝试将@Order(value = Ordered.LOWEST_PRECEDENCE) 添加到ActualProjectInterceptor 以使其在LibraryProjectInterceptor 之后执行,但它不起作用。谁能帮帮我

图书馆项目:

public class LibraryProjectInterceptor implements HandlerInterceptor {
 ......
}




  @Configuration
  @EnableWebMVC
  public class LibraryProjectConfig implements WebMvcConfigurer {
    ......
        @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(LibraryProjectInterceptor);
            }
    ......
    }

实际项目: pom.xml

 ......

<dependencies>
 <dependency> 
   <groupId>com.example</groupId>
   <artifactId>library-project</artifactId>
   <version>1.0.16</version>
 </dependency>
 ......

@Component
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class ActualProjectInterceptor implements HandlerInterceptor{
.......
}

@SpringBootApplication
public class ActualProjectConfig implements WebMvcConfigurer {
......
    @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(ActualProjectInterceptor);
        }
......
}

【问题讨论】:

    标签: java spring spring-boot maven pom.xml


    【解决方案1】:

    试试这个,我希望它会工作。

    @Component
    public class ActualProjectInterceptor implements HandlerInterceptor {}
    
    @SpringBootApplication
    public class ActualProjectConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(ActualProjectInterceptor)
                    .order(Ordered.LOWEST_PRECEDENCE);
        }
    }
    

    addInterceptor() 方法创建 InterceptorRegistration DSL 对象,该对象具有 order() 方法来指定您需要的内容。

    【讨论】:

    • 嘿。谢啦!有效。我想知道为什么 @Order 注释不起作用。你能解释一下吗
    • 如果没有看到实际的代码库registry.addInterceptor(ActualProjectInterceptor) -> ActualProjectInterceptor,我无法回答这个名称是对 Spring Bean 的引用,或者您使用了 new 运算符来创建对象。如果是第二个选项,我认为@Order 将不起作用,因为它与 Spring 引擎密切相关,创建一个作为序数 bean 的类(没有 Spring 支持)可能是根本原因。
    • 是的!我认为你是对的。 'LibraryProjectInterceptor' 是使用 'new' 运算符添加到注册表中的 registry.addInterceptor(new LibraryProjectInterceptor());
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2022-08-11
    • 2020-07-26
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2020-07-23
    相关资源
    最近更新 更多