Consider the following mapping:
@RequestMapping(value = "/superDuperPage", method = RequestMethod.GET) public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter) { return "somePage"; }
I want to handle the missing parameter case by not adding in required = false
. By default, 400
error is returned, but I want to return, let's say, a different page. How can I achieve this?
You can do it in three ways: Set required = false in @RequestParam annotation. Set defaultValue = “any default value” in @RequestParam annotation. Using Optional keyword.
Spring Boot made passing parameters easy with Java annotations. In the above URL, there are two parameters which are v and t. To pass the parameters, put “?”. Then, add the parameter name followed by “=” and the value of the parameter.
By default, all the request parameters annotated with @RequestParam are mandatory. Thus in the previous examples, if we skip a query string parameter from a request, we get a Bad Request response. ~ curl -i 'http://localhost:8080/data4' -- HTTP/1.1 400 ...
The @PathVariable annotation is used for data passed in the URI (e.g. RESTful web services) while @RequestParam is used to extract the data found in query parameters. These annotations can be mixed together inside the same controller. @PathParam is a JAX-RS annotation that is equivalent to @PathVariable in Spring.
If a required @RequestParam
is not present in the request, Spring will throw a MissingServletRequestParameterException
exception. You can define an @ExceptionHandler
in the same controller or in a @ControllerAdvice
to handle that exception:
@ExceptionHandler(MissingServletRequestParameterException.class) public void handleMissingParams(MissingServletRequestParameterException ex) { String name = ex.getParameterName(); System.out.println(name + " parameter is missing"); // Actual exception handling }
I want to return let's say a different page. How to I achieve this?
As the Spring documentation states:
Much like standard controller methods annotated with a
@RequestMapping
annotation, the method arguments and return values of@ExceptionHandler
methods can be flexible. For example, theHttpServletRequest
can be accessed in Servlet environments and thePortletRequest
in Portlet environments. The return type can be aString
, which is interpreted as a view name, aModelAndView
object, aResponseEntity
, or you can also add the@ResponseBody
to have the method return value converted with message converters and written to the response stream.
An alternative
If you use the @ControllerAdvice on your class and if it extends the Spring base class ResponseEntityExceptionHandler. A pre-defined function has been created on the base class for this purpose. You have to override it in your handler.
@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); }
This base class is very useful, especially if you want to process the validation errors that the framework creates.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With