Добавление глобальной обработки ошибок для контроллеров Spring Rest - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть много таких контроллеров, как этот

@RestController
@RequestMapping("/contracts")
public class ContractsController {

    @Autowired
    ContractsService service;

    @PostMapping("/selectAll")
    public WebMessageModel selectAll(@RequestBody ContractFiltersInputModel inputModel) {
        return new WebMessageModel(true, service.selectAll(inputModel));
    }
}

И у меня есть другой контроллер

@Controller
public class BaseController {

    private static Logger logger = LoggerFactory.getLogger(IndexController.class);

    @RequestMapping
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {

            String requestURI = request.getRequestURI();
            StringBuffer requestURL = request.getRequestURL();
            logger.info("-----requestURI => " + requestURI + ", requestURL => " + requestURL);

            request.getRequestDispatcher(requestURI).forward(request, response);

            logger.info("-----response has been commited");

        } catch (Throwable t) {
            t.printStackTrace();
            request.getRequestDispatcher("/handleException").forward(request, response);

        }

    }
}

Мне нужны все входящие запросы для прохождения через этот BaseController для создания одного глобального TRY-КРЫТЬ блок.Как я могу это реализовать?Этот подход действительно хорошая идея?Может быть, есть еще какие-то удивительные подходы?

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Вы можете использовать фильтры для выполнения некоторой логики до или после запросов. В вашем случае глобальная обработка ошибок была бы более полезной:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(
      RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

Этот фрагмент взят из здесь .

0 голосов
/ 12 сентября 2018

Если вы хотите перехватывать каждый запрос к конечной точке вашего контроллера до того, как войдет в метод контроллера, вам нужно будет реализовать filter.Вы можете пройти этот учебник , чтобы понять, как реализовать фильтр.

Если вы хотите перехватывать все исключения, возникающие в результате запросов к конечным точкам вашего контроллера (исключение могло быть сгенерированогде угодно - контроллер, служба, хранилище и т. д.) в одном месте, тогда вы должны реализовать ExceptionHandler s в пределах ControllerAdvice.Простой пример будет выглядеть следующим образом:

@ControllerAdvice
public class ExceptionHandlerAdvice {

@ExceptionHandler(MismatchedInputException.class)
public ResponseEntity<Void> handleMismatchedInputException(MismatchedInputException e) {
    return ResponseEntity.status(BAD_REQUEST).build();
}

@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity<Void> handleInvalidFormatException(InvalidFormatException e) {
    return ResponseEntity.status(UNPROCESSABLE_ENTITY).build();
}

}

Вышеприведенное будет гарантировать, что любое исключение, указанное в обработчике исключений, будет перехвачено здесь, чтобы можно было упростить ответ исключения из вашего REST API.Больше на том же здесь .

0 голосов
/ 12 сентября 2018

То, что вы ищете, это @ControllerAdvice. Вот как это использовать http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...