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

JavaSpring-如何处理缺少的必需请求参数,java,spring,spring-mvc,Java,Spring,Spring Mvc,考虑以下映射: @RequestMapping(value = "/superDuperPage", method = RequestMethod.GET) public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter) { return "somePage"; } 我想通过not添加required=false来处理缺少参数的情况。默认情况下,

考虑以下映射:

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

我想通过not添加
required=false
来处理缺少参数的情况。默认情况下,返回
400
error,但我想返回另一个页面。如何实现这一点?

如果请求中不存在所需的
@RequestParam
,Spring将抛出异常。您可以在同一控制器或
@ControllerAdvice
中定义
@ExceptionHandler
来处理该异常:

@ExceptionHandler(MissingServletRequestParameterException.class)
public void handleMissingParams(MissingServletRequestParameterException ex) {
    String name = ex.getParameterName();
    System.out.println(name + " parameter is missing");
    // Actual exception handling
}
我想返回另一页。我如何做到这一点

作为缔约国:

很像用
@RequestMapping
注释,的方法参数和返回值
@ExceptionHandler
方法可以很灵活
。例如
HttpServletRequest
可以在Servlet环境和 Portlet环境中的PortletRequest返回类型可以是
字符串
,它被解释为视图名称
,一个
模型和视图
对象,一个
ResponseEntity
,或者您也可以添加
@ResponseBody
以获得 方法返回使用消息转换器转换并写入的值 响应流


您可以使用Spring 4.1Java 8来实现这一点,方法是利用可选类型。在您的示例中,这意味着您的@RequestParam
字符串现在将具有
可选类型

以显示此功能的示例为例。

另一种选择

如果在类上使用@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);
}
@覆盖
protected ResponseEntity handleMissingServletRequestParameter(MissingServletRequestParameterException ex、HttpHeaders、HttpStatus状态、WebRequest请求){
String name=ex.getParameterName();
logger.error(名称+“参数丢失”);
返回super.handleMissingServletRequestParameter(例如,头、状态、请求);
}

这个基类非常有用,特别是如果您想处理框架创建的验证错误。

@Ali这非常有效。谢谢你的帮助。还有,有没有办法知道哪个方法引发了这个异常?我在
printStack()
@peech中找不到它。异常仅封装参数类型和参数名称信息。因此,不,您不知道是什么方法引发了异常。@AliDehghani在缺少多个参数的情况下如何查找参数名?有关@ConcollerAdvice的详细解释和示例,请参阅