Spring MVC обработка ошибок с кодом состояния ответа - PullRequest
0 голосов
/ 14 июля 2020

Помогите мне кто-нибудь, пожалуйста, в этом вопросе. Проект, над которым я работаю, является старым mvc, и его не нужно менять, так что придется разобраться с тем, «что у нас есть :)». это мой метод контроллера, класс которого помечен @Controller

@RequestMapping(method=RequestMethod.POST)
public String createSomething(@RequestBody somejson, Model m) throws Exception {
    SomeCustomListenerClass listener = new SomeCustomListenerClass(m);
    AnnotherClass ac = somejson.toNotification(someService, anotherService, listener);
    try {
        ac = someService.createSomething(ac, listener);
        m.addAttribute("success", true);
        m.addAttribute("notificationId", ac.getId());
    }
    catch(SawtoothException ex) {
        return handleError(ex, "Create Notification", listener);
    }
    return "structured";
}

, а этот - тело метода handleError

    private String handleError(Exception ex, String operation, SomeCustomListenerClass listener) {
    if (!listener.hasErrors()) {
        log.error("Unexpected error getting notification detail", ex);
        listener.error("notification.controllerException", operation);
    }
    return "error";
}

Теперь я получаю правильные ошибки в клиенте сторона, скажем, в браузере, но также получение кода состояния 500 введите описание изображения здесь

теперь мой босс говорит, что мы должны получить 400, когда возникают ошибки проверки, а не 500, как сейчас. Итак, пожалуйста, помогите мне, ребята, как решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 14 июля 2020

добавить @ ResponseStatus (HttpStatus.BAD_REQUEST) поверх метода handleError (...).

@ExceptionHandler({ Throwable.class })
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleError(...) {
   ...
}
0 голосов
/ 17 июля 2020

Вы можете расширить свои исключения и выбросить их на свой контроллер:

@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Your exception message")  
public class YourCustomException extends RuntimeException {
}

Или вы можете использовать ExceptionControllerHandler:

@Controller
public class ExceptionHandlingController {

  // @RequestHandler methods
  ...
  
  // Exception handling methods
  
  // Convert a predefined exception to an HTTP Status code
  @ResponseStatus(value=HttpStatus.CONFLICT,
                  reason="Data integrity violation")  // 409
  @ExceptionHandler(DataIntegrityViolationException.class)
  public void conflict() {
    // Nothing to do
  }
  
  // Specify name of a specific view that will be used to display the error:
  @ExceptionHandler({SQLException.class,DataAccessException.class})
  public String databaseError() {
    // Nothing to do.  Returns the logical view name of an error page, passed
    // to the view-resolver(s) in usual way.
    // Note that the exception is NOT available to this view (it is not added
    // to the model) but see "Extending ExceptionHandlerExceptionResolver"
    // below.
    return "databaseError";
  }

  // Total control - setup a model and return the view name yourself. Or
  // consider subclassing ExceptionHandlerExceptionResolver (see below).
  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception ex) {
    logger.error("Request: " + req.getRequestURL() + " raised " + ex);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }
}
0 голосов
/ 14 июля 2020

Попробуйте аннотацию @ExceptionHandler или @ControllerAdvice для создания собственных механизмов обработки исключений:

https://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm

...