Spring boot MVC interceptor

Мне было необходимо добавить в spring сервер имитацию ошибок. Причем сделать это так, чтобы не менять исходный код сервера и иметь возможность собрать сервер без этой, нужной только для тестирования, функциональности.

Для этого я использовал перехватчики запросов spring (interceptor). В моем случае предобработчик вызывается до кода сервера, если необходимо имитирует нужную тесту ситуацию, а дарлее уже будет вызван штатный обработчик сервера.

Тест сообщает о необходимости имитации определенных ситуацих с помощью дополнительных http headers, которые по стандарту HTTP сервер должен игнорировать, поэтому управление прозрачно для основного кода сервера.

Код перехватчика:

@Controller
public class EmulatorInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object object) {
        // check http-header for test command
        final String emulateError = request.getHeader(EMULATE_HEADER);
        if (Objects.equals(EMULATE_NETWORK_CLOSE, emulateError)) {
            ((Response) response).getHttpChannel().getEndPoint().close();
            return false;  // finish request processing
        }
        return true;  // continue request processing in the server controller
    }
}

Мы можем сформировать свой ответ в response (тогда надо вернуть false и штатный обработчик уже не будет вызываться), или сказать spring, что надо вызвать штатный обработчик (вернуть true).

Конфигурационный код, который подключает перехватчик к spring приложению:

@Component
public class InterceptorConfig implements WebMvcConfigurer {

    private final EmulatorInterceptor emulatorInterceptor;

    @Autowired
    public InterceptorConfig(EmulatorInterceptor emulatorInterceptor) {
        this.emulatorInterceptor = emulatorInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(emulatorInterceptor);
    }
}
Опубликовано February 21, 2018