博客
关于我
Hibernate Validator校验参数全攻略
阅读量:424 次
发布时间:2019-03-06

本文共 3506 字,大约阅读时间需要 11 分钟。

数据校验是现代应用开发中不可或缺的一部分。它不仅保障了数据的语义正确性,还能显著提升系统的健壮性和用户体验。在Spring Boot开发中,Hibernate Validator是最成熟的数据校验框架之一。通过合理使用约束注解,我们可以在开发过程中建立起清晰的数据规则,避免因输入数据问题带来的后续麻烦。

数据校验的痛点

传统的数据校验方式往往存在以下问题:

  • 逻辑复杂:为了确保数据的语义正确性,开发者需要编写大量的条件判断逻辑。
  • 代码冗余:在不同层次的业务逻辑中可能会出现重复的校验逻辑,导致代码维护成本上升。
  • 难以维护:随着项目规模的扩大,复杂的校验逻辑难以管理和扩展。
  • 这些问题不仅影响开发效率,还可能导致系统潜在的安全隐患和功能缺陷。

    JSR-303校验规范及其实现

    为了解决上述痛点,JSR-303(Java Specification Request 303)提供了一套标准化的数据校验规范。Hibernate Validator是JSR-303的参考实现,它不仅支持JSR-303定义的所有约束,还提供了一些扩展功能。通过将验证逻辑与领域模型绑定,开发者可以显著提升代码的可维护性和复用性。

    Hibernate Validator的常用约束注解

    Hibernate Validator提供了丰富的约束注解,涵盖了从基础类型到复杂场景的各种验证需求。以下是常用的约束注解及其使用示例:

    约束注解 详细信息
    @Null 被注释的元素必须为null。
    @NotNull 被注释的元素必须不为null。
    @AssertTrue 被注释的元素必须为true。
    @AssertFalse 被注释的元素必须为false。
    @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
    @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
    @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
    @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
    @Size(max, min) 被注释的元素的大小必须在指定的范围内。
    @Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内。
    @Past 被注释的元素必须是一个过去的日期。
    @Future 被注释的元素必须是一个将来的日期。
    @Pattern(value) 被注释的元素必须符合指定的正则表达式。
    @Email 被注释的元素必须是电子邮箱地址。
    @Length 被注释的字符串的大小必须在指定的范围内。
    @NotEmpty 被注释的字符串必须非空。
    @Range 被注释的元素必须在合适的范围内。

    验证注解的使用

    在Spring Boot中使用Hibernate Validator非常简单。只需在项目依赖中添加以下依赖即可:

    org.springframework.boot
    spring-boot-starter-validation

    通过在方法参数上添加@Valid注解,可以启用参数校验。例如:

    @PostMapping("/add")public RestResponse addStudent(@Valid @RequestBody Student student) {    return RestBody.okData(student);}

    当发送无效数据时,系统会抛出MethodArgumentNotValidException异常,提示具体的校验失败原因。

    自定义约束注解

    在实际开发中,可能会遇到一些特殊场景,例如对枚举值的校验。我们可以通过定义自定义约束注解来实现特定业务规则。

    例如,定义一个用于校验颜色枚举的约束注解:

    import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Color {    String message() default "颜色不符合规格";    Colors[] value();}

    然后实现对应的约束验证器:

    public class ColorConstraintValidator implements ConstraintValidator
    { private Set
    allowedColors = new HashSet<>(); @Override public void initialize(Color constraintAnnotation) { allowedColors.addAll(Arrays.asList(constraintAnnotation.value())); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return allowedColors.contains(value); }}

    在需要校验的字段上添加@Color注解:

    @Datapublic class Param {    @Color({Colors.BLUE, Colors.YELLOW})    private String color;}

    常见问题

    在实际使用中,可能会遇到以下问题:

  • 基础类型校验不生效

    如果直接在路径变量或请求体参数上使用约束注解,可能会导致校验不生效。解决方法是在方法所在类上添加@Validated注解。

    @GetMapping("/rest/{color}")public RestResponse rest(@Validated @Color({Colors.BLUE, Colors.YELLOW}) @PathVariable String color) {    return RestBody.okData(color);}
  • 集合类型参数校验

    如果需要校验集合类型参数中的元素,可以在类上添加@Validated注解。

    @PostMapping("/batchadd")public RestResponse batchAddStudent(@Validated @RequestBody List
    students) { return RestBody.okData(students);}
  • 嵌套校验问题

    对嵌套对象的属性进行校验时,需要确保@Valid注解正确应用在方法参数上。

    @Datapublic class Student {    @NotBlank(message = "姓名必须填")    private String name;    @Age    private Integer age;    @NotEmpty(message = "成绩必填")    private List
    scores; @Valid @NotNull(message = "学校不能为空") private School school;}
  • 总结

    通过Hibernate Validator,我们可以专注于业务开发,避免因数据校验问题带来的后续麻烦。通过合理使用约束注解,我们可以建立清晰的数据规则,提升系统的健壮性和用户体验。在实际开发中,可以通过自定义约束注解来满足特定业务需求。此外,合理使用@Valid注解,并结合Spring Boot的统一异常处理,可以有效解决参数校验异常的提示问题。更多技术分享和DEMO,可以关注公众号:Felordcn。

    转载地址:http://rajuz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上打点并显示图标和文字
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers各组件默认的css样式
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    VM16+ubuntu20.04+win10如何固定虚拟机的ip (固定IP)
    查看>>
    OpenLayers学习一:地图加载(以类为接口)
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>
    OpenLayers学习二:点标记的添加删除和修改(以类为接口)
    查看>>