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

新手上路,请多包涵

考虑以下映射:

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

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

原文由 peech 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

如果请求中不存在必需的 @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 对象,一个 ResponseEntity ,15也可以添加 @ResponseBody 用消息转换器转换方法返回值并写入响应流。

原文由 Ali Dehghani 发布,翻译遵循 CC BY-SA 3.0 许可协议

替代

如果您在类上使用 @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);
}

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

原文由 Eric Giguere 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题