Spring Boot中如何对请求传入的字符串列表做校验?
Spring Boot校验List类型字段的实现方案
一、引入校验依赖
首先确保项目中引入Spring Boot校验starter,Maven配置如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
二、修改请求参数类,添加集合元素校验
要对List<String>中的每个邮箱地址进行校验,需给集合字段添加@Valid触发内部元素校验,配合@ElementCollection让校验框架识别集合元素,再补充具体校验规则:
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import jakarta.validation.Valid; import jakarta.persistence.ElementCollection; import java.util.List; class DataRequest{ @Size(min=1, max=10, message = "标题长度需在1-10之间") private String dataTitle; @Valid @ElementCollection @NotBlank(message = "邮箱不能为空") @Email(message = "邮箱格式不合法") private List<String> emails; // 必须提供getter、setter,否则校验框架无法读取字段值 public String getDataTitle() { return dataTitle; } public void setDataTitle(String dataTitle) { this.dataTitle = dataTitle; } public List<String> getEmails() { return emails; } public void setEmails(List<String> emails) { this.emails = emails; } }
三、在控制器中触发校验
在接口方法的DataRequest参数上添加@Valid注解,通过BindingResult手动捕获处理校验错误:
import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.validation.Valid; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("/api") public class DataController { @PostMapping("/submit") public ResponseEntity<String> submitData(@Valid @RequestBody DataRequest request, BindingResult bindingResult) { if (bindingResult.hasErrors()) { List<String> errorMessages = bindingResult.getAllErrors() .stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.toList()); return ResponseEntity.badRequest().body(String.join("; ", errorMessages)); } // 执行业务逻辑 return ResponseEntity.ok("数据提交成功"); } }
四、自定义校验规则(可选)
如果需要自定义规则(比如限制邮箱为公司域名),可以创建自定义注解和校验器:
- 自定义校验注解:
import jakarta.validation.Constraint; import jakarta.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = CompanyEmailValidator.class) public @interface CompanyEmail { String message() default "必须是公司域名邮箱"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
- 实现校验器:
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; public class CompanyEmailValidator implements ConstraintValidator<CompanyEmail, String> { @Override public boolean isValid(String email, ConstraintValidatorContext context) { if (email == null || email.isBlank()) { return false; } // 示例:校验邮箱是否以@yourcompany.com结尾 return email.endsWith("@yourcompany.com"); } }
- 在
DataRequest中使用自定义注解:
@Valid @ElementCollection @NotBlank(message = "邮箱不能为空") @Email(message = "邮箱格式不合法") @CompanyEmail(message = "必须使用公司域名邮箱") private List<String> emails;
五、全局异常处理(可选)
若不想每个接口手动处理BindingResult,可通过全局异常处理器统一捕获MethodArgumentNotValidException:
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.List; import java.util.stream.Collectors; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<List<String>> handleValidationExceptions(MethodArgumentNotValidException ex) { List<String> errors = ex.getBindingResult().getAllErrors() .stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.toList()); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } }
此时控制器方法可简化为:
@PostMapping("/submit") public ResponseEntity<String> submitData(@Valid @RequestBody DataRequest request) { // 执行业务逻辑 return ResponseEntity.ok("数据提交成功"); }
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

