温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java参数如何校验

发布时间:2026-07-23 17:08:47 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 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");
    }
}

✅ 简单直接
❌ 重复代码多,不适合大型项目


二、使用 Bean Validation(最推荐,尤其是 Spring 项目)

1️⃣ 引入依赖(Spring Boot 已内置)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2️⃣ 在 DTO / 实体类上加注解

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;
}

3️⃣ Controller 参数校验(自动生效)

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public String create(@RequestBody @Valid UserDTO userDTO) {
        return "ok";
    }
}

✅ 参数非法时自动抛出 MethodArgumentNotValidException


4️⃣ 普通方法参数校验(需 @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 时间

五、自定义校验(高级)

1️⃣ 自定义注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StatusValidator.class)
public @interface ValidStatus {
    String message() default "状态非法";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2️⃣ 校验逻辑

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
✅ 数据库做最终兜底(唯一、非空)


如果你愿意,我可以:

  • ✅ 给你 Spring Boot 完整示例
  • ✅ 讲 Method 参数 vs Bean 参数校验区别
  • ✅ 讲 为什么 @Valid 和 @Validated 不一样

你可以直接说你的使用场景(Controller / Service / 工具类)。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI