Java Spring - 如何处理缺少的必需请求参数

2022-09-01 01:23:55

请考虑以下映射:

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

我想通过添加来处理缺少参数的情况。默认情况下,返回错误,但我想返回,比方说,一个不同的页面。我怎样才能做到这一点?required = false400


答案 1

如果请求中不存在必需项,Spring 将引发 MissingServletRequestParameterException 异常。您可以在同一控制器中定义 一个,也可以在 中定义 一个来处理该异常:@RequestParam@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文档所述:

与使用注释进行注释的标准控制器方法非常相似,@ExceptionHandler方法的方法参数和返回值可以灵活。例如,可以在 Servlet 环境和 Portlet 环境中访问 。返回类型可以是 String,它被解释为视图名称、对象、一个 ,或者您也可以添加 ,以使方法返回值与消息转换器一起转换并写入响应流。@RequestMappingHttpServletRequestPortletRequestModelAndViewResponseEntity@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);
}

此基类非常有用,尤其是在要处理框架创建的验证错误时。


推荐