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