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.1及Java 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的详细解释和示例,请参阅