Java Spring - как обрабатывать отсутствующие требуемые параметры запроса

Рассмотрим следующее отображение:

@RequestMapping(value = "/superDuperPage", method = RequestMethod.GET)
public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter)
{
    return "somePage";
}

Я хочу обработать пропущенный случай параметра, не добавляя в required = false. По умолчанию возвращается ошибка 400, но я хочу, скажем, другую страницу. Как мне этого добиться?

Ответ 1

Если в запросе нет требуемого @RequestParam, Spring будет вызывать исключение MissingServletRequestParameterException. Вы можете определить @ExceptionHandler в том же контроллере или в @ControllerAdvice для обработки этого исключения:

@ExceptionHandler(MissingServletRequestParameterException.class)
public void handleMissingParams(MissingServletRequestParameterException ex) {
    String name = ex.getParameterName();
    System.out.println(name + " parameter is missing");
    // Actual exception handling
}

Я хочу вернуться, скажем, другую страницу. Как это достичь?

Как сообщает Spring документация:

Как стандартные методы контроллера, аннотированные с помощью @RequestMappingаннотация, аргументы метода и возвращаемые значения @ExceptionHandler методы могут быть гибкими. Например, HttpServletRequest можно получить в средах Servlet, а PortletRequest в среде Portlet. Тип возврата может быть String, который интерпретируется как имя представления, объект ModelAndView, a ResponseEntity, или вы также можете добавить @ResponseBody, чтобы возвращаемое значение метода, преобразованное с помощью конвертеров сообщений, и записывается в поток ответов.

Ответ 2

Альтернатива

Если вы используете @ControllerAdvice в своем классе и расширяет базовый класс Spring ResponseEntityExceptionHandler. Для этой цели в базовом классе была создана предопределенная функция. Вы должны переопределить это в своем обработчике.

    @Override
protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    String name = ex.getParameterName();
    logger.error(name + " parameter is missing");

    return super.handleMissingServletRequestParameter(ex, headers, status, request);
}

Этот базовый класс очень полезен, особенно если вы хотите обрабатывать ошибки валидации, создаваемые платформой.

Ответ 3

Вы можете сделать это с помощью Spring 4.1 и Java 8, используя тип Необязательный. В вашем примере это означает, что ваш @RequestParam String будет иметь тип Optional<String>.

Взгляните на эту статью, чтобы продемонстрировать эту функцию.