如何判断请求参数是否为空?含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)) { /* 用户名不能为空 */ }- Apache Commons Lang的
自定义工具方法
若不想引入第三方依赖,可封装通用判断方法适配多类型: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
相关产品推荐
相关产品推荐

