注解校验
https://cloud.iocoder.cn/validator/#_1-%E5%8F%82%E6%95%B0%E6%A0%A1%E9%AA%8C%E6%B3%A8%E8%A7%A3


手动校验
@Resource
private Validator validator;
java
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validator;
@RestController
@RequestMapping("/task")
public class TaskController {
@Autowired
private Validator validator; // Spring 会自动注入 Hibernate Validator
@PostMapping("/importTaskExcel")
public CommonResult<?> importTaskExcel(@RequestParam("file") MultipartFile file) throws Exception {
if (!verifySuffix(file)) {
throw new ServiceException("文件必须以xls、xlsx结尾");
}
// 1. 解析 Excel
List<TaskImportExcelVO> list = ExcelUtils.read(file, true, TaskImportExcelVO.class);
// 2. 手动逐条校验
List<String> errorMessages = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
TaskImportExcelVO vo = list.get(i);
Set<ConstraintViolation<TaskImportExcelVO>> violations = validator.validate(vo);
if (!violations.isEmpty()) {
for (ConstraintViolation<TaskImportExcelVO> violation : violations) {
// 收集错误,带上 Excel 行号更直观
errorMessages.add("第" + (i + 1) + "行: " + violation.getMessage());
}
}
}
// 3. 如果有错误,直接返回
if (!errorMessages.isEmpty()) {
return CommonResult.error("导入失败", errorMessages);
}
// 4. 正常导入
return companyTaskService.importTaskExcel(list);
}
}