有时希望将请求中的某些数据直接赋值给控制器方法的参数,例如路径变量、请求参数、请求头、Cookie值等。但是若不经过检查就直接将请求数据赋值控制器方法可能会出现一些错误,请看下面的例子。
1 @RestController("/test") 2 public class TestController { 3 4 @GetMapping("/evaluation/{evaluation:\\w{1,20}}") 5 public Evaluation evaluation(@PathVariable("evaluation") Evaluation evaluation) { 6 return evaluation; 7 } 8 9 @GetMapping(path="/param", params="param") 10 public String param(@RequestParam("param") String param) { 11 return param; 12 } 13 14 } 15 16 enum Evaluation {praised, not_evaluated, criticized}
第一个控制器方法将请求的路径变量evaluation赋值给枚举参数evaluation。枚举Evaluation可用的值有praised, not_evalauted, criticized。如果用户访问的路径是/test/evaluation/error,Spring将会抛出警告:警告内包含异常MethodArgumentTypeMismatchException:未能将String类型的值转换为目标类型Evalaution。
第二个控制器方法将请求参数param赋值给形参param。如果用户访问的链接是localhost:8080/test/param(注意:此链接不带参数),Spring将抛出警告Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "param" not met for actual request parameters: ]
我希望消除这种警告。我知道的办法有两种。第一种,对每个需要检查参数的控制器方法都配置一个拦截器;第二种,在控制器方法参数的注解内加上required=false,然后在方法的开头校验参数。
第一种方法可能不具有通用性,我听人说拦截器应该做通用的检查,而不是专门的检查,也许用拦截器不太合适。第二种方法在方法开头有一堆if语句检查参数,感觉不太优雅。
不知道有没有合适的方法解决检查参数的问题?
实测发现,全局异常处理器确实能拦截我的错误,但是Spring异常处理器仍然会在控制台输出警告。我希望解决的问题是不要输出警告。
全局异常处理
看看能不能拦截到