java bean 校验validation

参数校验是我们程序开发中必不可少的过程。为了保持程序的健壮性,需要对数据进行校验。

  1. 简单的校验

    在po实体类中添加注解

import org.hibernate.validator.constraints.Length;

/**
 * 通知记录
 *
 * @author cuijiao
 * @date 2018年1月12日
 */
public class Inform {
    private Long id;

    @Length(min = 0, max = 50)
    private String title;

    @Length(min = 0, max = 255)
    private String content;

    private String acceptorId;

    private String acceptorName;

    // 通知方式:短信、邮箱、系统通知
    private Integer informWay;

    // 是否紧急0否1是
    private Boolean isUrgent;

}

在controller中使用此校验

 /**
     * 添加Inform对象
     * @param book
     */
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public void addInform(@Valid Inform inform) {
        System.out.println(inform.toString());
    }
  1. 关联校验
    在一个有关联关系的字段或者属性上标注 @Valid . 这样,如果一个对象被校验,那么
    它的所有的标注了 @Valid 的关联对象都会被校验
/**
*Person类
*/
public class Person {
@NotNull
private String name;
public Person() {
}
}
/**
*Car类
*/
public class Car {
@NotNull
@Valid
private Person driver;
public Car(Person driver) {
this.driver = driver;
}

如果校验 Car 的实例对象的话,因为它的driver属性标注了 @Valid , 那么关联的 Person 也会被校验.
所以,如果对象 Person 的name属性如果是 null 的话,那么校验会失败.

关联校验也适用于集合类型的字段, 也就是说,任何下列的类型:

•数组
•实现了 java.lang.Iterable 接口( 例如 Collection , List 和 Set )
•实现了 java.util.Map 接口
如果标注了 @Valid , 那么当主对象被校验的时候,这些集合对象中的元素都会被校验.

public class RecordAttachment {
    private Long id;

    private Long opId;

    private String name;

    @URL
    private String url;
   }

/**
 * 操作日志封装对象
 *
 * @author cuijiao
 * @date 2018年1月22日
 */
public class RecordDTO extends Record {
    /**
     * 操作日志附件
     */
    @Valid
    private List<RecordAttachment> recordAttachments;
   }

如果校验RecordDTO时,附件集合中任一附件url不符合url正则,校验就会失败

  1. 分组校验
    定义两个空接口,分别代表对象的增加校验规则和修改校验规则
/**
 * 用于添加分组标识
 *
 * @author cuijiao
 * @date 2018年1月17日
 */
public interface ValidAdd {
}


/**
 * 用于修改分组标识
 *
 * @author cuijiao
 * @date 2018年1月17日
 */
public interface ValidUpdate {
}

po实体类上添加注解时使用指明所述的分组

/**
 * 工单提醒设置
 *
 *
 * @author cuijiao
 * @date 2018年1月16日
 */
public class Remind {
    @NotNull(groups = { ValidUpdate.class })
    private Long id;

    @NotNull(groups = { ValidAdd.class })
    @Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
    private String name;

    // 工单类型+业务类型(唯一索引)
    @NotNull(groups = { ValidAdd.class })
    private Integer wsType;

    @NotNull(groups = { ValidAdd.class })
    private Integer businessType;

    /**
     * (数据字典)紧急程度:普通、紧急、非常紧急
     */
    private Integer urgentLevel;

    @Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
    private String informTitle;

    @Length(min = 0, max = 255, groups = { ValidAdd.class, ValidUpdate.class })
    private String informContent;
}

启用校验
此时启用校验和之前的不同,需要指明启用哪一组规则

 /**
     * 新建提醒设置
     *
     *
     * @param remind
     * @return
     *
     * @author cuijiao
     * @date 2018年1月16日
     */
    @RequestMapping(value = "add", method = RequestMethod.POST)
    public void addRemind(@Validated(value = { ValidAdd.class }) Remind remind) {
      //添加操作
     @Validated(value = { ValidAdd.class }) 表示使用ValidAdd这套校验规则
        }
    }
   /**
     *
     * 更新提醒设置
     *
     * @param remind
     * @return
     *
     * @author cuijiao
     * @date 2018年1月16日
     */
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public ResponseEntity updateRemind(@Validated(value = { ValidUpdate.class }) Remind remind) {
        // 更新提醒設置
      @Validated(value = { ValidUpdate.class }) 表示使用ValidUpdate这套校验规则
    }

猜你喜欢

转载自blog.csdn.net/qq_34777858/article/details/79242646