返回

在项目开发中我们经常使用到的注解

后端

写在前面

在项目开发中,我们经常会遇到需要对用户输入的数据进行校验的情况,例如:

  • 注册时,需要校验用户名和密码是否合法。
  • 登录时,需要校验用户名和密码是否正确。
  • 下订单时,需要校验收货地址和电话号码是否正确。
  • ....

如果我们不进行数据校验,很可能会导致程序出现各种各样的问题,例如:

  • 用户名或密码不合法,导致注册失败。
  • 用户名或密码不正确,导致登录失败。
  • 收货地址或电话号码不正确,导致无法发货。
  • ....

为了避免这些问题,我们需要对用户输入的数据进行校验。目前,Java 中提供了多种数据校验框架,例如:

  • JSR-303 Bean Validation
  • Hibernate Validator
  • Apache Commons Validator
  • ...

其中,JSR-303 Bean Validation 是 Java EE 7 中引入的一个标准,它提供了一套标准的数据校验注解,我们可以直接在 Java Bean 中使用这些注解来校验数据。Hibernate Validator 是 JSR-303 Bean Validation 的一个实现,它提供了更加丰富的校验注解和更强大的校验功能。Apache Commons Validator 是一个轻量级的数据校验框架,它提供了简单易用的校验功能。

在本文中,我们将主要介绍如何使用 JSR-303 Bean Validation 和 Hibernate Validator 来进行数据校验。

JSR-303 Bean Validation

JSR-303 Bean Validation 是一个标准的数据校验框架,它提供了丰富的校验注解,我们可以直接在 Java Bean 中使用这些注解来校验数据。JSR-303 Bean Validation 的校验注解主要分为两类:

  • 内置校验注解:JSR-303 Bean Validation 提供了常用的内置校验注解,例如 @NotNull@NotEmpty@Size@Pattern 等。
  • 自定义校验注解:如果内置校验注解不能满足我们的需求,我们可以自定义校验注解。
@NotNull
private String name;

@NotEmpty
private String password;

@Size(min = 1, max = 10)
private String address;

@Pattern(regexp = "^[0-9]*
@NotNull
private String name;

@NotEmpty
private String password;

@Size(min = 1, max = 10)
private String address;

@Pattern(regexp = "^[0-9]*$")
private String phone;
quot;
) private String phone;

使用 JSR-303 Bean Validation 进行数据校验非常简单,我们只需要在 Java Bean 中使用校验注解来标注需要校验的属性即可。当我们对 Java Bean 进行校验时,校验框架会自动扫描 Java Bean 中的校验注解,并根据校验注解的规则对属性进行校验。如果校验不通过,校验框架会抛出 javax.validation.ConstraintViolationException 异常。

Hibernate Validator

Hibernate Validator 是 JSR-303 Bean Validation 的一个实现,它提供了更加丰富的校验注解和更强大的校验功能。Hibernate Validator 的校验注解主要分为两类:

  • 内置校验注解:Hibernate Validator 提供了常用的内置校验注解,例如 @NotNull@NotEmpty@Size@Pattern 等。
  • 自定义校验注解:如果内置校验注解不能满足我们的需求,我们可以自定义校验注解。

Hibernate Validator 的自定义校验注解可以通过 @Constraint 注解来实现。@Constraint 注解需要指定两个参数:

  • validatedBy:指定校验注解的实现类。
  • message:指定校验注解的错误消息。
@Constraint(validatedBy = PhoneValidator.class, message = "手机号码格式不正确")
public @interface Phone {

}
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.matches("^1[3-9]\\d{9}
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.matches("^1[3-9]\\d{9}$");
    }
}
quot;
); } }

使用 Hibernate Validator 进行数据校验也非常简单,我们只需要在 Java Bean 中使用校验注解来标注需要校验的属性即可。当我们对 Java Bean 进行校验时,校验框架会自动扫描 Java Bean 中的校验注解,并根据校验注解的规则对属性进行校验。如果校验不通过,校验框架会抛出 javax.validation.ConstraintViolationException 异常。

总结

在本文中,我们介绍了如何使用 JSR-303 Bean Validation 和 Hibernate Validator 来进行数据校验。数据校验对于提高代码质量和减少 bug 的产生非常重要。建议大家在项目开发中养成使用数据校验的习惯。