考虑以下Map:
@RequestMapping(value = "/superDuperPage", method = RequestMethod.GET)
public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter)
{
return "somePage";
}
我想通过在required = false
中添加而不是来处理缺少参数的情况。默认情况下,返回400
错误,但我想返回,比如说,一个不同的页面。我如何实现这一点?
5条答案
按热度按时间x6yk4ghg1#
如果请求中不存在所需的
@RequestParam
,Spring将抛出MissingServletRequestParameterException
异常。您可以在同一个控制器或@ControllerAdvice
中定义@ExceptionHandler
来处理该异常:我想返回让我们说一个不同的页面。我如何实现这一点?
正如Spring文档所述:
与使用
@RequestMapping
注解的标准控制器方法非常相似,@ExceptionHandler
方法的方法参数和返回值可以是灵活的。例如,HttpServletRequest
可以在Servlet环境中访问,PortletRequest
可以在Portlet环境中访问。返回类型可以是String
,它被解释为视图名称,一个ModelAndView
对象,一个ResponseEntity
,或者你也可以添加@ResponseBody
,让方法返回值用消息转换器转换并写入响应流。3yhwsihp2#
一个替代
如果你在你的类上使用**@ControllerAdvice**,并且它扩展了Spring基类ResponseIdentyExceptionException。已经为此在基类上创建了一个预定义的函数。你必须在你的处理程序中覆盖它。
这个基类非常有用,特别是当您想要处理框架创建的验证错误时。
neskvpey3#
您可以在Spring 4.1和Java 8中通过利用Optional类型来做到这一点。在您的示例中,这意味着您的**@RequestParam**
String
现在将具有Optional<String>
类型。Take a look at this article的示例展示了此功能。
enxuqcxy4#
我今天(30/08/2023)使用Spring 3.1.3时遇到了同样的问题。您可以通过重写
ResponseEntityExceptionHandler
基类的受保护函数handleMissingServletRequestParameter
来解决此问题。r7xajy2e5#
也许不是那么相关,但我遇到了类似的需求:将5xx错误更改为4xx错误,因为缺少身份验证头。
控制器如下:
当你cURL它没有授权头,你得到一个5xx错误:
要将其更改为401,您可以
您可以通过自动化测试来验证它: