Spring RequestParam能否无需额外代码禁止空串或空白字符?
Spring @RequestParam 空/空白参数校验问题解答
默认行为
你当前的代码里,@RequestParam(required = true)只负责校验请求中必须包含该参数,并不会校验参数值是否为空字符串或仅含空白字符。所以当收到/test?states=""或/test?states=" "这类请求时,Spring会把空字符串/空白字符串正常解析到states列表中,不会触发任何错误。
无需自定义校验代码的解决方案
可以直接借助Spring自带的Validation校验框架实现,不用自己写额外的校验逻辑:
- 确保依赖存在:如果是Spring Boot项目,确保已经引入
spring-boot-starter-validation依赖(Spring Boot 3.x用jakarta.validation包,2.x用javax.validation包) - 开启校验功能:在你的Controller类或者当前方法上添加
@Validated注解 - 添加参数校验注解:针对
List<String>类型的参数,需要同时校验列表非空,且每个元素都不是空白字符串:
修改后的示例代码:
import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @Validated // 开启参数校验 public class TestController { @GetMapping("/test") public List<StatesInfoVO> getTestStates( @RequestParam(required = true) @Valid // 递归校验列表中的每个元素 List<@NotBlank(message = "状态值不能为空或仅含空白字符") String> states) { // 业务逻辑实现 return null; } }
配置完成后,当请求中传入空字符串或仅含空白的states参数时,Spring会自动触发校验失败,返回400 Bad Request响应,并携带你定义的错误提示信息,完全不需要手动写校验代码。
注解说明
@NotBlank:专门针对字符串,校验规则是字符串不为null,且去除首尾空白后长度大于0,刚好匹配你禁止空/空白字符串的需求@Valid:作用在集合参数上,会自动校验集合中的每一个元素@Validated:必须添加,它是Spring开启方法级别参数校验的开关,没有这个注解的话,其他校验注解不会生效
内容的提问来源于stack exchange,提问作者PositiveM
相关产品推荐
相关产品推荐

