前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【hibernate validator】(五)分组约束

【hibernate validator】(五)分组约束

作者头像
程序员朱永胜
发布2023-08-27 15:36:20
1460
发布2023-08-27 15:36:20
举报

首发博客地址

https://blog.zysicyj.top/

一、请求组

1. 人组

代码语言:javascript
复制
package?org.hibernate.validator.referenceguide.chapter05;
public?class?Person?{
????@NotNull
????private?String?name;
????public?Person(String?name)?{
????????this.name?=?name;
????}
????//?getters?and?setters?...
}

2. 驱动组

代码语言:javascript
复制
public?class?Driver?extends?Person?{
????@Min(
????????????value?=?18,
????????????message?=?"You?have?to?be?18?to?drive?a?car",
????????????groups?=?DriverChecks.class
????)
????public?int?age;
????@AssertTrue(
????????????message?=?"You?first?have?to?pass?the?driving?test",
????????????groups?=?DriverChecks.class
????)
????public?boolean?hasDrivingLicense;
????public?Driver(String?name)?{
????????super(?name?);
????}
????public?void?passedDrivingTest(boolean?b)?{
????????hasDrivingLicense?=?b;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
}

3. 汽车组

代码语言:javascript
复制
public?class?Car?{
????@NotNull
????private?String?manufacturer;
????@NotNull
????@Size(min?=?2,?max?=?14)
????private?String?licensePlate;
????@Min(2)
????private?int?seatCount;
????@AssertTrue(
????????????message?=?"The?car?has?to?pass?the?vehicle?inspection?first",
????????????groups?=?CarChecks.class
????)
????private?boolean?passedVehicleInspection;
????@Valid
????private?Driver?driver;
????public?Car(String?manufacturer,?String?licencePlate,?int?seatCount)?{
????????this.manufacturer?=?manufacturer;
????????this.licensePlate?=?licencePlate;
????????this.seatCount?=?seatCount;
????}
????public?boolean?isPassedVehicleInspection()?{
????????return?passedVehicleInspection;
????}
????public?void?setPassedVehicleInspection(boolean?passedVehicleInspection)?{
????????this.passedVehicleInspection?=?passedVehicleInspection;
????}
????public?Driver?getDriver()?{
????????return?driver;
????}
????public?void?setDriver(Driver?driver)?{
????????this.driver?=?driver;
????}
????//?getters?and?setters?...
}

4. 使用验证组

代码语言:javascript
复制
//?create?a?car?and?check?that?everything?is?ok?with?it.
Car?car?=?new?Car(?"Morris",?"DD-AB-123",?2?);
Set<ConstraintViolation<Car>>?constraintViolations?=?validator.validate(?car?);
assertEquals(?0,?constraintViolations.size()?);
//?but?has?it?passed?the?vehicle?inspection?
constraintViolations?=?validator.validate(?car,?CarChecks.class?);
assertEquals(?1,?constraintViolations.size()?);
assertEquals(
????????"The?car?has?to?pass?the?vehicle?inspection?first",
????????constraintViolations.iterator().next().getMessage()
);
//?let's?go?to?the?vehicle?inspection
car.setPassedVehicleInspection(?true?);
assertEquals(?0,?validator.validate(?car,?CarChecks.class?).size()?);
//?now?let's?add?a?driver.?He?is?18,?but?has?not?passed?the?driving?test?yet
Driver?john?=?new?Driver(?"John?Doe"?);
john.setAge(?18?);
car.setDriver(?john?);
constraintViolations?=?validator.validate(?car,?DriverChecks.class?);
assertEquals(?1,?constraintViolations.size()?);
assertEquals(
????????"You?first?have?to?pass?the?driving?test",
????????constraintViolations.iterator().next().getMessage()
);
//?ok,?John?passes?the?test
john.passedDrivingTest(?true?);
assertEquals(?0,?validator.validate(?car,?DriverChecks.class?).size()?);
//?just?checking?that?everything?is?in?order?now
assertEquals(
????????0,?validator.validate(
????????car,
????????Default.class,
????????CarChecks.class,
????????DriverChecks.class
).size()
);

二、组继承(?)

  • 定义一个超级跑车
代码语言:javascript
复制
public?class?SuperCar?extends?Car?{
????@AssertTrue(
????????????message?=?"Race?car?must?have?a?safety?belt",
????????????groups?=?RaceCarChecks.class
????)
????private?boolean?safetyBelt;
????//?getters?and?setters?...
}
代码语言:javascript
复制
import?javax.validation.groups.Default;
public?interface?RaceCarChecks?extends?Default?{
}
  • 使用组继承
代码语言:javascript
复制
//?create?a?supercar?and?check?that?it's?valid?as?a?generic?Car
SuperCar?superCar?=?new?SuperCar(?"Morris",?"DD-AB-123",?1??);
assertEquals(?"must?be?greater?than?or?equal?to?2",?validator.validate(?superCar?).iterator().next().getMessage()?);
//?check?that?this?supercar?is?valid?as?generic?car?and?also?as?race?car
Set<ConstraintViolation<SuperCar>>?constraintViolations?=?validator.validate(?superCar,?RaceCarChecks.class?);
assertThat(?constraintViolations?).extracting(?"message"?).containsOnly(
????????"Race?car?must?have?a?safety?belt",
????????"must?be?greater?than?or?equal?to?2"
);

三、定义组序列(?)

  • 定义序列组
代码语言:javascript
复制
import?javax.validation.GroupSequence;
import?javax.validation.groups.Default;
@GroupSequence({?Default.class,?CarChecks.class,?DriverChecks.class?})
public?interface?OrderedChecks?{
}
  • 使用序列组
代码语言:javascript
复制
Car?car?=?new?Car(?"Morris",?"DD-AB-123",?2?);
car.setPassedVehicleInspection(?true?);
Driver?john?=?new?Driver(?"John?Doe"?);
john.setAge(?18?);
john.passedDrivingTest(?true?);
car.setDriver(?john?);
assertEquals(?0,?validator.validate(?car,?OrderedChecks.class?).size()?);

四、重新定义默认的组顺序

@GroupSequence

  • 定义一个具有重定义的默认组的类
代码语言:javascript
复制
@GroupSequence({?RentalChecks.class,?CarChecks.class,?RentalCar.class?})
public?class?RentalCar?extends?Car?{
????@AssertFalse(message?=?"The?car?is?currently?rented?out",?groups?=?RentalChecks.class)
????private?boolean?rented;
????public?RentalCar(String?manufacturer,?String?licencePlate,?int?seatCount)?{
????????super(?manufacturer,?licencePlate,?seatCount?);
????}
????public?boolean?isRented()?{
????????return?rented;
????}
????public?void?setRented(boolean?rented)?{
????????this.rented?=?rented;
????}
}
代码语言:javascript
复制
public?interface?RentalChecks?{
}
  • 使用重新定义的默认组
代码语言:javascript
复制
RentalCar?rentalCar?=?new?RentalCar(?"Morris",?"DD-AB-123",?2?);
rentalCar.setPassedVehicleInspection(?true?);
rentalCar.setRented(?true?);
Set<ConstraintViolation<RentalCar>>?constraintViolations?=?validator.validate(?rentalCar?);
assertEquals(?1,?constraintViolations.size()?);
assertEquals(
????????"Wrong?message",
????????"The?car?is?currently?rented?out",
????????constraintViolations.iterator().next().getMessage()
);
rentalCar.setRented(?false?);
constraintViolations?=?validator.validate(?rentalCar?);
assertEquals(?0,?constraintViolations.size()?);

@GroupSequenceProvider

  • 实现和使用默认组序列
代码语言:javascript
复制
public?class?RentalCarGroupSequenceProvider
????????implements?DefaultGroupSequenceProvider<RentalCar>?{
????@Override
????public?List<Class<?>>?getValidationGroups(RentalCar?car)?{
????????List<Class<?>>?defaultGroupSequence?=?new?ArrayList<Class<?>>();
????????defaultGroupSequence.add(?RentalCar.class?);
????????if?(?car?!=?null?&&?!car.isRented()?)?{
????????????defaultGroupSequence.add(?CarChecks.class?);
????????}
????????return?defaultGroupSequence;
????}
}
代码语言:javascript
复制
@GroupSequenceProvider(RentalCarGroupSequenceProvider.class)
public?class?RentalCar?extends?Car?{
????@AssertFalse(message?=?"The?car?is?currently?rented?out",?groups?=?RentalChecks.class)
????private?boolean?rented;
????public?RentalCar(String?manufacturer,?String?licencePlate,?int?seatCount)?{
????????super(?manufacturer,?licencePlate,?seatCount?);
????}
????public?boolean?isRented()?{
????????return?rented;
????}
????public?void?setRented(boolean?rented)?{
????????this.rented?=?rented;
????}
}

五、组转换(?)

  • 必须集合@Valid哦,否则报错
代码语言:javascript
复制
public?class?Driver?{
????@NotNull
????private?String?name;
????@Min(
????????????value?=?18,
????????????message?=?"You?have?to?be?18?to?drive?a?car",
????????????groups?=?DriverChecks.class
????)
????public?int?age;
????@AssertTrue(
????????????message?=?"You?first?have?to?pass?the?driving?test",
????????????groups?=?DriverChecks.class
????)
????public?boolean?hasDrivingLicense;
????public?Driver(String?name)?{
????????this.name?=?name;
????}
????public?void?passedDrivingTest(boolean?b)?{
????????hasDrivingLicense?=?b;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
????//?getters?and?setters?...
}
代码语言:javascript
复制
@GroupSequence({?CarChecks.class,?Car.class?})
public?class?Car?{
????@NotNull
????private?String?manufacturer;
????@NotNull
????@Size(min?=?2,?max?=?14)
????private?String?licensePlate;
????@Min(2)
????private?int?seatCount;
????@AssertTrue(
????????????message?=?"The?car?has?to?pass?the?vehicle?inspection?first",
????????????groups?=?CarChecks.class
????)
????private?boolean?passedVehicleInspection;
????@Valid
????@ConvertGroup(from?=?Default.class,?to?=?DriverChecks.class)
????private?Driver?driver;
????public?Car(String?manufacturer,?String?licencePlate,?int?seatCount)?{
????????this.manufacturer?=?manufacturer;
????????this.licensePlate?=?licencePlate;
????????this.seatCount?=?seatCount;
????}
????public?boolean?isPassedVehicleInspection()?{
????????return?passedVehicleInspection;
????}
????public?void?setPassedVehicleInspection(boolean?passedVehicleInspection)?{
????????this.passedVehicleInspection?=?passedVehicleInspection;
????}
????public?Driver?getDriver()?{
????????return?driver;
????}
????public?void?setDriver(Driver?driver)?{
????????this.driver?=?driver;
????}
????//?getters?and?setters?...
}
代码语言:javascript
复制
//?create?a?car?and?validate.?The?Driver?is?still?null?and?does?not?get?validated
Car?car?=?new?Car(?"VW",?"USD-123",?4?);
car.setPassedVehicleInspection(?true?);
Set<ConstraintViolation<Car>>?constraintViolations?=?validator.validate(?car?);
assertEquals(?0,?constraintViolations.size()?);
//?create?a?driver?who?has?not?passed?the?driving?test
Driver?john?=?new?Driver(?"John?Doe"?);
john.setAge(?18?);
//?now?let's?add?a?driver?to?the?car
car.setDriver(?john?);
constraintViolations?=?validator.validate(?car?);
assertEquals(?1,?constraintViolations.size()?);
assertEquals(
????????"The?driver?constraint?should?also?be?validated?as?part?of?the?default?group",
????????constraintViolations.iterator().next().getMessage(),
????????"You?first?have?to?pass?the?driving?test"
);
```ss?the?driving?test"
);

本文由 mdnice 多平台发布

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首发博客地址
  • 一、请求组
    • 1. 人组
      • 2. 驱动组
        • 3. 汽车组
          • 4. 使用验证组
          • 二、组继承(?)
          • 三、定义组序列(?)
          • 四、重新定义默认的组顺序
            • @GroupSequence
              • @GroupSequenceProvider
              • 五、组转换(?)
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com