zoukankan      html  css  js  c++  java
  • Java参数验证Bean Validation 框架

    1、为什么要做参数校验?

    参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式、校验不太通过时统一异常描述。

    2、bean validation规范

        JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来。JSR303注解如下:

    Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:

    Spring validtor 同样扩展了jsr303,并实现了方法参数和返回值的校验

    JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验。

    3、注意事项

    Bean Validation 规范规定在对 Java Bean 进行约束验证前,目标元素必须满足以下条件:

    • 如果验证的是属性(getter 方法),那么必须遵从 Java Bean 的命名习惯(JavaBeans 规范);
    • 静态的字段和方法不能进行约束验证;
    • 约束适用于接口和基类;
    • 约束注解定义的目标元素可以是字段、属性或者类型等;
    • 可以在类或者接口上使用约束验证,它将对该类或实现该接口的实例进行状态验证;
    • 字段和属性均可以使用约束验证,但是不能将相同的约束重复声明在字段和相关属性(字段的 getter 方法)上。
    接口完成级联验证的方式就是使用 @Valid 注解,在Controler中级联验证用@Validated。

    对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证。

     public class Person {

        private long id;
        /**
         * 添加groups 属性,说明只在特定的验证规则里面起作用,不加则表示在使用Deafault规则时起作用
         */
        @NotNull(groups = {PersonAddView.class, PersonModifyView.class}, message = "添加、修改用户时名字不能为空", payload = ValidateErrorLevel.Info.class)
        @ListNotHasNull.List({
                @ListNotHasNull(groups = {PersonAddView.class}, message = "添加上Name不能为空"),
                @ListNotHasNull(groups = {PersonModifyView.class}, message = "修改时Name不能为空")})
        private String name;
    
        @NotNull(groups = {PersonAddView.class}, message = "添加用户时地址不能为空")
        private String address;
    
        @Min(value = 18, groups = {PersonAddView.class}, message = "姓名不能低于18岁")
        @Max(value = 30, groups = {PersonModifyView.class}, message = "姓名不能超过30岁")
        private int age;
      //getter setter 方法......
    }
      /**
         * 添加一个Person对象
         * 此处启用PersonAddView 这个验证规则
         * 备注:此处@Validated(PersonAddView.class) 表示使用PersonAndView这套校验规则,若使用@Valid 则表示使用默认校验规则,
         * 若两个规则同时加上去,则只有第一套起作用
         */
        @RequestMapping(value = "/person", method = RequestMethod.POST)
        public void addPerson(@RequestBody @Validated({PersonAddView.class, Default.class}) Person person) {
            System.out.println(person.toString());
        }
    
        /**
         * 修改Person对象
         * 此处启用PersonModifyView 这个验证规则
         */
        @RequestMapping(value = "/person", method = RequestMethod.PUT)
        public void modifyPerson(@RequestBody @Validated(value = {PersonModifyView.class}) Person person) {
            System.out.println(person.toString()); 

    } 

     Bean Validation 技术规范特性概述

     Java Bean Validation 最佳实践 - 北言 - 博客园

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/doit8791/p/10459767.html
Copyright © 2011-2022 走看看