You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理未定义的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:17:30