如何处理未定义的@RequestParam参数?实现单参数适配
Spring Boot接口实现可选参数需求
问题描述
我编写了如下Spring Boot接口代码,用于返回两个字符串拼接后的结果:
@GetMapping("/concat") public String conc(@RequestParam("c1") String con1,@RequestParam("c2") String con2){ return stringService.conc(con1, con2); }
现需实现仅传入c1参数时接口也能正常工作,此时c2可为null或不传递。我尝试了如下代码但未生效,且不清楚如何使用@ExceptionHandler(若这是可行方案):
@GetMapping("/concat") public String conc(@RequestParam("c1") String con1,@RequestParam("c2") String con2){ if(con2 == null){ return con1; }else{ return stringService.conc(con1, con2); } }
请问该如何实现需求?
解决方案
核心原因:@RequestParam默认必填
你之前的代码无效,是因为@RequestParam注解默认required=true,如果不传c2,Spring会直接抛出MissingServletRequestParameterException,根本进不了方法执行null判断。
方案一:设置c2为可选参数(推荐)
给c2的@RequestParam添加required=false,这样不传参数时con2会被赋值为null,你的逻辑就能正常执行:
@GetMapping("/concat") public String conc(@RequestParam("c1") String con1, @RequestParam(value = "c2", required = false) String con2){ if(con2 == null){ return con1; }else{ return stringService.conc(con1, con2); } }
如果需要给c2设置默认值(比如空字符串),可以用defaultValue属性,这样不用额外判断就能直接调用拼接方法:
@GetMapping("/concat") public String conc(@RequestParam("c1") String con1, @RequestParam(value = "c2", defaultValue = "") String con2){ return stringService.conc(con1, con2); }
方案二:用@ExceptionHandler处理缺失参数(不推荐)
如果一定要用@ExceptionHandler,可以在控制器或全局异常处理类中捕获MissingServletRequestParameterException,判断缺失的是c2时,返回c1的值:
@RestController public class YourController { @GetMapping("/concat") public String conc(@RequestParam("c1") String con1,@RequestParam("c2") String con2){ return stringService.conc(con1, con2); } @ExceptionHandler(MissingServletRequestParameterException.class) public ResponseEntity<String> handleMissingParam(MissingServletRequestParameterException ex) { String paramName = ex.getParameterName(); if ("c2".equals(paramName)) { // 获取已传入的c1参数 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String con1 = request.getParameter("c1"); if (con1 != null) { return ResponseEntity.ok(con1); } } // 缺失其他参数时返回错误响应 return ResponseEntity.badRequest().body("缺失必填参数:" + paramName); } }
这个方案步骤繁琐,不如直接设置参数可选简洁,优先用方案一。
内容的提问来源于stack exchange,提问作者CookieXIV
相关产品推荐
相关产品推荐

