在 Java 中,参数校验(Parameter Validation)常见做法有多种,取决于你是在方法内部校验、Controller 层校验,还是统一校验。下面按常见场景系统讲解,并给出示例。
public void updateUser(String name, Integer age) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("name不能为空");
}
if (age == null || age <= 0) {
throw new IllegalArgumentException("age必须大于0");
}
}
✅ 简单直接
❌ 重复代码多,不适合大型项目
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
import jakarta.validation.constraints.*;
public class UserDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@Min(value = 1, message = "年龄必须大于0")
private Integer age;
@Email(message = "邮箱格式不正确")
private String email;
}
@RestController
@Validated
public class UserController {
@PostMapping("/user")
public String create(@RequestBody @Valid UserDTO userDTO) {
return "ok";
}
}
✅ 参数非法时自动抛出 MethodArgumentNotValidException
@Validated)@Service
@Validated
public class UserService {
public void test(@NotBlank String name, @Min(1) int age) {
System.out.println(name + age);
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handle(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(e ->
errors.put(e.getField(), e.getDefaultMessage())
);
return errors;
}
}
| 注解 | 说明 |
|---|---|
@NotNull |
不能为 null |
@NotBlank |
字符串不能为空(trim 后) |
@NotEmpty |
集合 / 数组 / 字符串不能为空 |
@Min / @Max |
数值范围 |
@Size |
长度 / 大小 |
@Email |
邮箱 |
@Pattern |
正则 |
@Positive |
正数 |
@Future / @Past |
时间 |
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StatusValidator.class)
public @interface ValidStatus {
String message() default "状态非法";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class StatusValidator implements ConstraintValidator<ValidStatus, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext ctx) {
return value != null && (value == 0 || value == 1);
}
}
| 层级 | 推荐方式 |
|---|---|
| Controller | @Valid / @Validated |
| Service | 业务关键校验 |
| DAO | 不校验(数据库约束兜底) |
| 工具方法 | 手动 if |
✅ 用 Bean Validation
✅ 校验规则写在 DTO 上
✅ 统一异常处理
✅ 不重复使用 if
✅ 数据库做最终兜底(唯一、非空)
如果你愿意,我可以:
你可以直接说你的使用场景(Controller / Service / 工具类)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。