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

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("数据提交成功");
    }
}

四、自定义校验规则(可选)

如果需要自定义规则(比如限制邮箱为公司域名),可以创建自定义注解和校验器:

  1. 自定义校验注解:
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 {};
}
  1. 实现校验器:
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");
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:26:36