Spring MVC - перехватчик никогда не вызывал

76
5

Я пытаюсь настроить перехватчик в своем приложении, и я не могу заставить его работать.

В моем классе конфигурации приложения я сконфигурировал следующее:

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

Кто-нибудь знает, почему не вызывается?

спросил(а) 2021-01-25T19:29:52+03:00 4 месяца, 3 недели назад
1
Решение
166

Я использую Spring Boot и имел ту же проблему, когда addInterceptors() для регистрации перехватчика, но перехватчик никогда не запускался во время запроса. Однако конфигурация XML не сработала.

В принципе, вам не нужен класс WebMvcConfigurerAdapter. Вам просто нужно объявить @Bean типа MappedInterceptor:

@Bean
public MappedInterceptor myInterceptor()
{
return new MappedInterceptor(null, new MyInterceptor());
}

ответил(а) 2021-01-25T19:29:52+03:00 4 месяца, 3 недели назад
99

Классы-перехватчики должны быть объявлены в конфигурационном файле xml контекстного контекста в теге <mvc:interceptors>. Ты сделал это?

Из документации

Пример регистрации перехватчика, применяемого ко всем URL-адресам:

<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

Пример регистрации перехватчика, ограниченного определенным URL-адресом:

<mvc:interceptors>
<mvc:interceptor>
<mapping path="/secure/*"/>
<bean class="org.example.SecurityInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

Таким образом, вам нужно настроить класс MyInterceptor в XML файле весеннего контекста

ответил(а) 2021-01-25T19:29:52+03:00 4 месяца, 3 недели назад
45

Если это возможно. Используйте этот подход:

public class Application extends WebMvcConfigurerAdapter{
...
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}

public @Override void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor());
}
}

вместо:

@Bean
public MappedInterceptor myInterceptor()
{
return new MappedInterceptor(null, new MyInterceptor());
}

потому что с первого вы можете использовать функции впрыска (например, @Autowired и т.д.)

ответил(а) 2021-01-25T19:29:52+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема