Для перехвата ответа от 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 контроллеров и выполнять различные действия, такие как добавление заголовков, обработка исключений и многое другое.