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

如何判断请求参数是否为空?含Spring框架下的实现方式

请求参数非空判断方案

通用场景下的参数非空判断方法

在通用Java开发中,判断请求参数是否为空需要覆盖不同数据类型的情况,常见方案如下:

  • 基础手动校验
    针对不同类型做针对性判断:

    • 字符串:需同时判断null、空串、全空白字符,示例:
      if (param == null || param.trim().isEmpty()) {
          // 参数为空,处理逻辑
      }
      
    • 集合/数组:判断是否为null或长度/元素数量为0,示例:
      if (list == null || list.isEmpty()) { /* 处理空集合 */ }
      if (array == null || array.length == 0) { /* 处理空数组 */ }
      
  • 第三方工具类辅助
    借助成熟工具类简化判断,避免重复造轮子:

    • Apache Commons Lang的StringUtils.isBlank(String):覆盖null、空串、全空白字符场景
    • Google Guava的Strings.isNullOrEmpty(String):仅判断null和空串,不处理全空白
      示例:
    if (StringUtils.isBlank(username)) { /* 用户名不能为空 */ }
    
  • 自定义工具方法
    若不想引入第三方依赖,可封装通用判断方法适配多类型:

    public static boolean isEmpty(Object obj) {
        if (obj == null) return true;
        if (obj instanceof String) return ((String) obj).trim().isEmpty();
        if (obj instanceof Collection) return ((Collection<?>) obj).isEmpty();
        if (obj instanceof Map) return ((Map<?, ?>) obj).isEmpty();
        if (obj.getClass().isArray()) return Array.getLength(obj) == 0;
        return false;
    }
    

Spring框架中的参数非空判断方案

Spring生态提供了更优雅、贴合Web场景的参数校验方案,主要分为以下几种:

1. 注解式校验(JSR-380 + Spring Validation)

这是Spring Boot项目中最常用的方式,通过注解声明校验规则,自动完成校验:

步骤1:定义DTO并添加校验注解

在请求参数的DTO类字段上标注对应校验注解:

public class UserCreateRequest {
    @NotBlank(message = "用户名不能为空") // 字符串非空且非空白
    private String username;
    
    @NotNull(message = "年龄不能为null") // 任意类型非null
    private Integer age;
    
    @NotEmpty(message = "兴趣列表不能为空") // 集合非空且元素数量>0
    private List<String> hobbies;
    
    // getter & setter
}

常用注解说明:

  • @NotNull:校验对象不能为null
  • @NotBlank:校验字符串不能为null、空串或全空白字符
  • @NotEmpty:校验集合/数组不能为null且长度>0

步骤2:在Controller中触发校验

在Controller方法的DTO参数前添加@Valid或@Validated注解,Spring会自动执行校验:

@PostMapping("/users")
public ResponseEntity<String> createUser(@Valid @RequestBody UserCreateRequest request) {
    // 校验通过后执行业务逻辑
    return ResponseEntity.ok("用户创建成功");
}

步骤3:全局捕获校验异常

校验不通过时Spring会抛出MethodArgumentNotValidException,可通过全局异常处理器返回统一错误格式:

@RestControllerAdvice
public class GlobalValidationExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationErrors(MethodArgumentNotValidException ex) {
        Map<String, String> errorMap = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach(error -> {
            String fieldName = ((FieldError) error).getField();
            String errorMsg = error.getDefaultMessage();
            errorMap.put(fieldName, errorMsg);
        });
        return ResponseEntity.badRequest().body(errorMap);
    }
}

2. 手动校验结合Spring工具类

对于简单的单个参数校验,可直接使用Spring自带的org.springframework.util.StringUtils工具类:

@GetMapping("/search")
public ResponseEntity<List<Product>> searchProducts(@RequestParam String keyword) {
    if (!StringUtils.hasText(keyword)) { // 判断字符串非null、非空串、非全空白
        return ResponseEntity.badRequest().body(Collections.singletonList("搜索关键词不能为空"));
    }
    // 执行搜索逻辑
    return ResponseEntity.ok(productService.search(keyword));
}

3. 自定义校验注解

针对业务专属的校验规则(如手机号格式+非空),可自定义校验注解:

步骤1:定义自定义注解

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidPhoneNumberValidator.class)
public @interface ValidPhoneNumber {
    String message() default "手机号格式不正确或为空";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

步骤2:实现校验器逻辑

public class ValidPhoneNumberValidator implements ConstraintValidator<ValidPhoneNumber, String> {
    private static final String PHONE_REGEX = "^1[3-9]\\d{9}$";

    @Override
    public boolean isValid(String phoneNumber, ConstraintValidatorContext context) {
        // 先判断非空,再校验格式
        if (!StringUtils.hasText(phoneNumber)) {
            return false;
        }
        return phoneNumber.matches(PHONE_REGEX);
    }
}

步骤3:使用自定义注解

public class UserUpdateRequest {
    @ValidPhoneNumber
    private String phone;
    // 其他字段...
}

内容的提问来源于stack exchange,提问作者user18360281

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:56:09