Как перхватить ответ от Spring MVC контроллера?

Для перехвата ответа от Spring MVC контроллера в Java вы можете использовать различные методы. Один из них - это использование аннотации @ControllerAdvice.

@ControllerAdvice позволяет вам определить глобальные обработчики исключений, общие для всех контроллеров вашего приложения. Этот класс может содержать методы для обработки исключений и выполнения некоторых действий после обработки запроса контроллером.

Вот пример, как это может быть реализовано:

@ControllerAdvice
public class CustomResponseAdvice {

    @ModelAttribute
    public void addHeader(Model model) {
        model.addAttribute("customHeader", "Custom Header Value");
    }

    @ResponseBody
    @ExceptionHandler(Exception.class)
    public ResponseEntity<CustomErrorResponse> handleException(Exception ex) {
        CustomErrorResponse error = new CustomErrorResponse();
        error.setMessage(ex.getMessage());
        error.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        // логирование ошибки
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

В данном примере у нас есть класс CustomResponseAdvice, помеченный аннотацией @ControllerAdvice. В нем определены два метода.

Первый метод с аннотацией @ModelAttribute добавляет пользовательский заголовок в модель. Это может быть полезным, если вам требуется передать некоторую информацию из контроллера во все представления.

Второй метод с аннотацией @ResponseBody и @ExceptionHandler перехватывает исключение любого типа и преобразует его в объект CustomErrorResponse, который содержит сообщение об ошибке и статус ошибки. Затем он возвращает ResponseEntity с телом ошибки и статусом INTERNAL_SERVER_ERROR.

Для того, чтобы этот класс CustomResponseAdvice был использован в вашем приложении, необходимо добавить следующую конфигурацию в классе конфигурации Spring MVC:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor());
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new CustomArgumentResolver());
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new CustomHttpMessageConverter());
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseTrailingSlashMatch(true);
    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
        returnValueHandlers.add(new CustomReturnValueHandler());
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true)
                .ignoreAcceptHeader(false)
                .defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML)
                .mediaType("json", MediaType.APPLICATION_JSON);
    }
}

В данном примере наш класс CustomResponseAdvice автоматически применяется ко всем контроллерам в вашем приложении и будет перехватывать и обрабатывать исключения в соответствии с его определенными правилами.

Таким образом, вы можете использовать аннотацию @ControllerAdvice и реализовать методы, которые будут перехватывать ответы от Spring MVC контроллеров и выполнять различные действия, такие как добавление заголовков, обработка исключений и многое другое.