java validateutils_Java参数校验工具validation实践

本文介绍了Java中使用validation进行参数校验的实践,包括简单的参数校验、自定义验证器的创建,并通过示例代码展示其用法,帮助简化代码并提高可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

在项目开发当中,数据校验是你必须要考虑和面对的事情,为此要写上一大串的代码进行校验,这样就会导致代码冗余和一些管理的问题。

例如下面的代码:

1 public void push(ListuserList, String url, String content) {2 Preconditions.checkArgument(CollectionUtils.isNotEmpty(userList), "用户列表不能为空");3 Preconditions.checkArgument(StringUtils.isNotEmpty(url), "推送url不能为空");4 Preconditions.checkArgument(StringUtils.isNotEmpty(content), "推送内容不能为空");5 }

validation可以做以下事情

validation可以抛出统一的参数校验异常,方便定位问题

编程简单,只需要注解就能搞定,不需要编写大量的代码

validation提供以下注解:

c6eb4050f33bc33e0bd6c6b1d6f08f01.png

使用

添加JAR包依赖

1

2 javax.validation

3 validation-api

4 1.1.0.Final

5

6

7

8 org.hibernate

9 hibernate-validator

10 5.2.0.Final

11

一、简单的参数校验

1 public classUserBean {2 @Range(min = 20, max = 50, message = "age应该在[20,50]之间")3 privateInteger age;4

5 @NotNull(message = "name不能为空")6 privateString name;7

8 @Length(max = 100, message = "address不能超过100")9 privateString address;10

11 @Email(message = "email格式不对")12 privateString email;13

14

15 publicInteger getAge() {16 returnage;17 }18

19 public voidsetAge(Integer age) {20 this.age =age;21 }22

23 publicString getName() {24 returnname;25 }26

27 public voidsetName(String name) {28 this.name =name;29 }30

31 publicString getAddress() {32 returnaddress;33 }34

35 public voidsetAddress(String address) {36 this.address =address;37 }38

39

40 publicString getEmail() {41 returnemail;42 }43

44 public voidsetEmail(String email) {45 this.email =email;46 }47

48 }

创建对象验证器

1 /**

2 * 对象验证器3 *4 * Created by Albert on 18/1/25.5 */

6 public classBeanValidator {7

8 /**

9 * 验证某个bean的参数10 *11 *@paramobject 被校验的参数12 *@throwsValidationException 如果参数校验不成功则抛出此异常13 */

14 public static voidvalidate(T object) {15 //获得验证器

16 Validator validator =Validation.buildDefaultValidatorFactory().getValidator();17 //执行验证

18 Set> constraintViolations =validator.validate(object);19 //如果有验证信息,则取出来包装成异常返回

20 if(CollectionUtils.isEmpty(constraintViolations)) {21 return;22 }23 throw newValidationException(convertErrorMsg(constraintViolations));24 }25

26 /**

27 * 转换异常信息28 *@paramset29 *@param30 *@return

31 */

32 private static String convertErrorMsg(Set>set) {33 Map errorMap = new HashMap<>();34 String property;35 for (ConstraintViolationcv : set) {36 //这里循环获取错误信息,可以自定义格式

37 property =cv.getPropertyPath().toString();38 if (errorMap.get(property) != null) {39 errorMap.get(property).append("," +cv.getMessage());40 } else{41 StringBuilder sb = newStringBuilder();42 sb.append(cv.getMessage());43 errorMap.put(property, sb);44 }45 }46 returnerrorMap.toString();47 }48 }

编写测试类

1 public classValidatorTest {2

3 public static voidmain(String[] args) {4 UserBean userBean = newUserBean();5 userBean.setAge(12);6 userBean.setName("张三");7 userBean.setAddress("124444444112");8 userBean.setEmail("123");9

10 BeanValidator.validate(userBean);11 }12 }

运行结果

d1133782cb06b16507e2074a1e334973.png

二、自定义验证器

定义注解,message、groups和payload三个属性是必须定义的。

1 @Target({ElementType.FIELD, ElementType.METHOD})2 @Retention(RetentionPolicy.RUNTIME)3 @Constraint(validatedBy = ZipCodeValidator.class)4 public @interfaceZipCode {5 String message() default "";6 Class>[] groups() default{};7 Class extends Payload>[] payload() default{};8 }

定义验证类

1 public class ZipCodeValidator implements ConstraintValidator{2

3 private String zipCodeReg = "[1-9]d{5}(?!d)";//表示邮编的正则表达式

4 private Pattern zipCodePattern =Pattern.compile(zipCodeReg);5

6

7 @Override8 public voidinitialize(ZipCode zipCode) {9

10 }11

12 @Override13 public booleanisValid(String val, ConstraintValidatorContext constraintValidatorContext) {14 if(val == null) {15 return true;16 }17 returnzipCodePattern.matcher(val).matches();18 }19 }

UserBean 加入以下代码

1 @ZipCode(message = "邮编格式错误")2 privateString zipCode;3

4 publicString getZipCode() {5 returnzipCode;6 }7

8 public voidsetZipCode(String zipCode) {9 this.zipCode =zipCode;10 }

编写测试类

1 public classValidatorTest {2

3 public static voidmain(String[] args) {4 UserBean userBean = newUserBean();5 userBean.setAge(12);6 userBean.setName("张三");7 userBean.setAddress("124444444112");8 userBean.setEmail("123");9

10 userBean.setZipCode("000111");11 BeanValidator.validate(userBean);12 }13 }

运行结果

eb67a6503e1868ad7f732385455f07a7.png

结语

本文只列举了部分常用的校验方法,还有更多的使用方式,就不在这里一一列举了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值