Как сделать так, чтобы несколько обработчиков Spring выполнялись в определенном порядке

#java #spring #spring-boot #maven #pom.xml

Вопрос:

В настоящее время я работаю над проектом Spring boot. У меня есть зависимость от библиотечного проекта, в котором есть перехватчик(LibraryProjectInterceptor.java) и a 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);
        }
......
}
 

Ответ №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() метод создает объект DSL регистрации перехватчика, у которого есть order() метод для указания того, что вам нужно.

Комментарии:

1. Эй. Спасибо, чувак! Это сработало. Интересно, почему аннотация @Order не сработала. Не могли бы вы, пожалуйста, объяснить это

2. Я не могу ответить, не видя фактической кодовой registry.addInterceptor(ActualProjectInterceptor) базы -> > ActualProjectInterceptor это имя было ссылкой на Spring Bean, или вы использовали new оператор для создания объекта. Если второй вариант, я думаю, @Order не сработает, потому что сильно связан с движком Spring, то основной причиной может быть создание класса в виде порядкового компонента (без поддержки Spring).

3. Да! Я думаю, что вы правы. «LibraryProjectInterceptor» был добавлен в реестр с помощью оператора «новый», подобного этому реестру.addInterceptor(новый LibraryProjectInterceptor());