在软件开发过程中,参数校验是确保数据完整性和应用安全的重要步骤。本篇博客旨在详细介绍Java中常用的参数校验方法,包括示例代码和中文注释,以便即使是编程新手也能理解和应用。
1. 使用Assert
进行基本校验
Spring框架提供的Assert
类是进行参数校验的一种快速简便方法。它能够帮助我们确保方法参数符合预期,否则会抛出IllegalArgumentException
。
示例:校验字符串非空
import org.springframework.util.Assert;
public void checkString(String input) {
// 校验字符串非空,如果为空则抛出异常
Assert.hasText(input, "输入字符串不能为空");
}
示例:校验集合非空
import org.springframework.util.Assert;
public void checkCollection(Collection<?> collection) {
// 校验集合非空,如果为空则抛出异常
Assert.notEmpty(collection, "集合不能为空");
}
2. 使用DateTimeFormatter
校验日期格式
对于需要按特定格式接收日期参数的场景,可以使用java.time.format.DateTimeFormatter
类进行日期字符串的校验。
示例:校验日期格式
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public void checkDateFormat(String dateStr) {
// 定义期望的日期格式
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 校验日期字符串是否符合预定格式
try {
LocalDate.parse(dateStr, dateFormatter);
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("日期格式不正确,正确格式应为 yyyy-MM-dd");
}
}
3. 使用注解进行校验
在使用Spring Boot等框架时,可以利用javax.validation
提供的注解来进行参数校验,减少手动校验的代码量。
示例:使用@NotNull
,@Size
,@Pattern
等注解
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Pattern;
public class UserInput {
@NotNull(message = "用户名不能为空")
private String username;
@Size(min = 6, max = 15, message = "密码长度必须在6到15之间")
private String password;
@Pattern(regexp = "^[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$", message = "邮箱格式不正确")
private String email;
// Getter和Setter省略
}
在控制器层,可以配合@Valid
或@Validated
注解使用,以自动触发这些校验规则。
4. 自定义校验逻辑
有时候,内置的校验注解无法满足复杂的业务需求,这时可以通过实现自定义校验注解来扩展校验逻辑。
示例:自定义注解校验密码复杂度
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = PasswordComplexityValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface PasswordComplexity {
String message() default "密码复杂度不足";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class PasswordComplexityValidator implements ConstraintValidator<PasswordComplexity, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 自定义校验逻辑:密码必须包含数字、大写字母、小写字母和特殊字符
return value.matches("(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,}");
}
}
通过这些方法,我们可以对输入参数进行严格的校验,确保数据的正确性和安全性。
希望这篇博客能帮助你更好地理解和应用Java中的参数校验技术。