Java Spring - how to handle missing required request parameters

前端 未结 3 908
再見小時候
再見小時候 2021-02-01 16:53

Consider the following mapping:

@RequestMapping(value = \"/superDuperPage\", method = RequestMethod.GET)
public String superDuperPage(@RequestParam(value = \"som         


        
相关标签:
3条回答
  • 2021-02-01 17:19

    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.

    0 讨论(0)
  • 2021-02-01 17:24

    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, the HttpServletRequest can be accessed in Servlet environments and the PortletRequest in Portlet environments. The return type can be a String, which is interpreted as a view name, a ModelAndView object, a ResponseEntity, or you can also add the @ResponseBody to have the method return value converted with message converters and written to the response stream.

    0 讨论(0)
  • 2021-02-01 17:28

    You can do this with Spring 4.1 onwards and Java 8 by leveraging the Optional type. In your example that would mean your @RequestParam String will have now type of Optional<String>.

    Take a look at this article for an example showcasing this feature.

    0 讨论(0)
提交回复
热议问题