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

pee*_*ech 19 java spring spring-mvc

考虑以下映射:

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

我想通过改变来处理缺少参数的情况required = false.默认情况下400会返回错误,但我想返回让我们说一个不同的页面.我怎么做到这一点?

Ali*_*ani 35

如果@RequestParam请求中不存在required ,Spring将抛出MissingServletRequestParameterException异常.您可以@ExceptionHandler在同一个控制器或a中定义一个@ControllerAdvice以处理该异常:

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

我想回来让我们说一个不同的页面.我怎么做到这一点?

正如Spring文档所述:

与使用@RequestMapping 注释注释的标准控制器方法非常相似,方法的方法参数和返回值 @ExceptionHandler可以是灵活的.例如, HttpServletRequest可以在Servlet环境和 PortletRequestPortlet环境中访问.返回类型可以是a String,它被解释为视图名称,ModelAndView对象,a ResponseEntity,或者您还可以添加@ResponseBody要使用消息转换器转换的方法返回值并将其写入响应流.


Eri*_*ere 8

替代

如果您在类上使用@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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 有关 @ContollerAdvice 的更详细解释和示例可以在 https://www.toptal.com/java/spring-boot-rest-api-error-handling 中找到 (2认同)

dim*_*sli 7

您可以在Spring 4.1及以上版本和Java 8中通过利用可选类型来实现此目的。在您的示例中,这意味着您的@RequestParam String现在将具有Optional<String>.

请查看这篇文章,了解展示此功能的示例。