spring boot 最佳实践(二)--使用Bean Validation

来源:互联网 发布:手机报价软件 编辑:程序博客网 时间:2024/06/05 16:35

JavaBean定义了一组规则,JavaBean就是遵循此规则的平常的Java对象。

满足这三个条件:
1. JavaBean类必须有一个没有参数的构造函数。
2. JavaBean类所有的属性最好定义为私有的。
3. JavaBean类中定义函数setXxx()和getXxx()来对属性进行操作。其中Xxx是首字母大写的私有变量名称。

传统的代码从展现层、业务逻辑层、持久层、数据传输层分别有不同的对象。VO、BO、PO、DTO、POJO傻傻分不清楚。在不同层有不同的数据校验代码,编写大量的if else、code message、throw new Exception。

传统的数据校验

在spring data jpa编程范式中,Entity实体是一个简单Java对象,Repository用于对一个entity的重建。建议统一使用简单Java对象POJO定义Entity实体,减少VO、DTO定义,不要定义存储对象PO。
微服务的数据校验
Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

Hibernate Validator 5.x 是Bean Validation 1.1参考实现。hibernate validator官方文档提供了注解的列表。

表 1. Bean Validation 中内置的 constraint

Constraint 详细信息 @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) 被注释的元素必须符合指定的正则表达式

表 2. Hibernate Validator 附加的 constraint

Constraint 详细信息 @Email 被注释的元素必须是电子邮箱地址 @Length 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range 被注释的元素必须在合适的范围内

项目搭建

首先添加hibernate validator 5依赖

<dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-validator</artifactId>    <version>5.4.1.Final</version></dependency>

如果想在代码中使用EL表达式还需引入。

<dependency>      <groupId>javax.el</groupId>      <artifactId>javax.el-api</artifactId>      <version>2.2.4</version>      <scope>provided</scope>  </dependency>

定义一个javabean

import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;public class Car {    @NotNull    private String manufacturer;    @NotNull    @Size(min = 2, max = 14)    private String licensePlate;    @Min(2)    private int seatCount;    public Car(String manufacturer, String licencePlate, int seatCount) {        this.manufacturer = manufacturer;        this.licensePlate = licencePlate;        this.seatCount = seatCount;    }    //getters and setters ...}

执行单元测试

import java.util.Set;import javax.validation.ConstraintViolation;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;import org.junit.BeforeClass;import org.junit.Test;import static org.junit.Assert.assertEquals;public class CarTest {    private static Validator validator;    @BeforeClass    public static void setUpValidator() {        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();        validator = factory.getValidator();    }    @Test    public void manufacturerIsNull() {        Car car = new Car( null, "DD-AB-123", 4 );        Set<ConstraintViolation<Car>> constraintViolations =                validator.validate( car );        assertEquals( 1, constraintViolations.size() );        assertEquals( "may not be null", constraintViolations.iterator().next().getMessage() );    }}

在spring mvc中使用 bean validation

spring mvc4.0支持 bean validation1.1,可以在controller中使用@Valid指定要校验的实体类。

//import javax.validation.Valid;@RequestMapping("/demo")public String demo(@Valid Demo demo,Model model){    // do something}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 热水器温度太高怎么办 热水器出热水小怎么办 天然气热水器水压不够怎么办 热水器水变小了怎么办 液压齿轮泵没力怎么办 gps总是浮点解怎么办 电源要做到稳压怎么办 变压器输出电压低怎么办 变压器输出电压高怎么办 家里空调带不动怎么办 小天才定位不准怎么办 伐木锯链条不出油怎么办 角磨机切割片卸不下来怎么办 油泵电机声音大怎么办 汽车油泵声音大怎么办 水泵电机噪音大怎么办 注塑机油泵超载怎么办 模具老是粘模怎么办 打印机提示卡纸2怎么办 扬子空调显示e9怎么办 供应商不配合售后怎么办? 数控车床显示屏不亮怎么办? 西威变频器过载怎么办 vgm申报错了怎么办 老公常年不回家怎么办 狗对主人龇牙怎么办 酒喝多了会尿床怎么办 6岁儿童尿床怎么办 遇到耍酒疯的人怎么办 老公喝完酒尿床怎么办 尿不尽影响睡觉怎么办 大便次数较多怎么办 吃的少拉不出来怎么办 吃奶的狗拉肚子怎么办 高跟鞋头折了怎么办 新生儿胯下破皮怎么办 led变压器坏了怎么办 家里电路烧坏了怎么办 接触器线圈烧了怎么办 凯恩帝准备未绪怎么办 冰箱按键没反应怎么办