javax.validation.constraints如何校验参数合法性

 更新时间:2024年07月04日 08:40:11   作者:xindoo  
本文将深入探讨javax.validation.constraints的基本用法和高级应用,帮助读者更好地理解和运用这个强大的校验框架,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

javax.validation.constraints校验参数合法性

在Java开发过程中,数据校验是一项至关重要的任务。

为了确保数据的完整性和正确性,我们通常需要对输入的数据进行一系列的校验。

javax.validation.constraints提供了一套基于注解的校验框架,能够让我们简洁、高效地完成数据校验工作。

基本用法:常用注解

javax.validation.constraints包含了一组基础的校验注解,覆盖了大多数常见的数据校验场景。

下面我们逐一介绍这些基本注解:

  • @NotNull: 用于检查值是否为null。
  • @NotEmpty: 用于检查字符串、集合、数组等类型是否为空或null。
  • @Size: 用于检查字符串、集合、数组等类型的元素个数是否在指定的范围内。
  • @Min: 用于检查数值是否大于等于指定的最小值。
  • @Max: 用于检查数值是否小于等于指定的最大值。
  • @DecimalMin: 用于检查数值是否大于等于指定的最小值(可以是浮点数)。
  • @DecimalMax: 用于检查数值是否小于等于指定的最大值(可以是浮点数)。
  • @Digits: 用于检查数值是否符合指定的整数位数和小数位数要求。
  • @Email: 用于检查字符串是否符合电子邮件格式。
  • @Pattern: 用于检查字符串是否符合指定的正则表达式。

以下是一个简单的示例,展示了如何使用这些基本注解对一个用户实体类进行校验:

import javax.validation.constraints.*;

public class User {

    @NotNull(message = "ID 不能为空")
    private Long id;

    @NotEmpty(message = "用户名不能为空")
    @Size(min = 2, max = 20, message = "用户名长度必须在 2 到 20 个字符之间")
    private String username;

    @Min(value = 18, message = "年龄必须大于等于 18 岁")
    @Max(value = 100, message = "年龄必须小于等于 100 岁")
    private int age;

    @Email(message = "电子邮件格式不正确")
    private String email;

    // Getter and Setter ...
}

高级应用:自定义注解和校验器

尽管javax.validation.constraints提供了丰富的基础注解,但有时我们还需要进行一些特定的校验操作。这时,我们可以通过自定义注解和校验器来实现这些需求。

以下是一个示例,展示了如何创建一个自定义注解@Password,用于检查密码是否符合强度要求(至少包含一个大写字母、一个小写字母和一个数字):

首先,创建自定义注解@Password

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = PasswordValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Password {

    String message() default "密码必须包含至少一个大写字母、一个小写字母和一个数字";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

然后,创建自定义校验器PasswordValidator

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PasswordValidator implements ConstraintValidator<Password, String> {

    private static final String PASSWORD_PATTERN = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$";

    @Override
    public void initialize(Password constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        return value.matches(PASSWORD_PATTERN);
    }
}

最后,在需要校验的字段上添加自定义注解@Password

public class User {

    // ... 其他字段

    @Password
    private String password;

    // Getter and Setter ...
}

整合Spring Boot

在Spring Boot项目中,我们可以很方便地整合javax.validation.constraints进行数据校验。

首先,需要在项目的pom.xml文件中添加以下依赖:

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

然后,在Controller方法的参数前添加@Valid注解,即可触发数据校验。

当校验失败时,Spring Boot会抛出MethodArgumentNotValidException异常。

我们可以通过定义全局异常处理器来捕获该异常,并将校验失败的信息返回给客户端:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException exception) {
        StringBuilder message = new StringBuilder();
        exception.getBindingResult().getFieldErrors().forEach(fieldError ->
                message.append(fieldError.getField()).append(": ").append(fieldError.getDefaultMessage()).append("; ")
        );
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message.toString());
    }
}

总结

以上就是javax.validation.constraints的基本用法和高级应用。

通过掌握这个强大的校验框架,我们可以轻松地为Java项目实现数据校验功能,从而提高代码的健壮性和可维护性。

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring中存对象和取对象的方式详解

    Spring中存对象和取对象的方式详解

    这篇文章主要介绍了Spring中存对象和取对象的方式,Spring中更简单的存对象与取对象的方式是注解,注解实现有两种方式:一在编译的时候,把注解替换成相关代码,并添加到我们原来的代码中,二拦截方法,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-08-08
  • Java CharacterEncodingFilter案例详解

    Java CharacterEncodingFilter案例详解

    这篇文章主要介绍了Java CharacterEncodingFilter案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 根据URL下载图片至客户端、服务器的简单实例

    根据URL下载图片至客户端、服务器的简单实例

    下面小编就为大家带来一篇根据URL下载图片至客户端、服务器的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • spring jdbctemplate的用法小结

    spring jdbctemplate的用法小结

    jdbcTemplate是spring框架中提供的一个对象,是对原始繁杂的jdbc 对象的简单封装,本文通过实例代码介绍spring jdbctemplate的用法小结,需要的朋友可以参考下
    2023-04-04
  • 基于Springboot疫苗接种行程管理系统的设计与实现

    基于Springboot疫苗接种行程管理系统的设计与实现

    本文主要介绍了基于Springboot实现的疫苗接种行程管理系统的示例代码,系统主要实现个人疫苗接种管理、行程管理、病史管理、风险地区管理、核酸检测报告结果上报、疫情新闻管理等功能,需要的可以参考一下
    2022-03-03
  • SpringBoot中@Transiactional注解没有效果的解决

    SpringBoot中@Transiactional注解没有效果的解决

    这篇文章主要介绍了SpringBoot中@Transiactional注解没有效果的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java对象的序列化与反序列化详解

    Java对象的序列化与反序列化详解

    这篇文章主要为大家详细介绍了Java对象的序列化与反序列化的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • java报错之springboot3+vue2项目web服务层报错总结

    java报错之springboot3+vue2项目web服务层报错总结

    java入门学习,随手记录一下开发过程中产生的报错,有些错误是网上搜索再加上自己尝试,随手引用了一些其他人的记录,也是留给自己看的,或是希望能对其他初学者有帮助

    2023-06-06
  • 深入了解Spring中的@Autowired和@Resource注解

    深入了解Spring中的@Autowired和@Resource注解

    Spring中的@Autowired和@Resource注解都可以实现依赖注入,但使用方式、注入策略和适用场景略有不同。本文将深入探讨这两种注解的原理、使用方法及优缺点,帮助读者更好地理解和运用Spring依赖注入机制
    2023-04-04
  • java项目如何引入其他jar包

    java项目如何引入其他jar包

    通常在lib文件夹中存放从外部引入的jar包,所以把JAR文件复制进去。 然后修改编译脚本,不需要去编译tool文件夹里面的java类,直接把jar包添加到classpath,下文将详细介绍
    2021-10-10

最新评论