简述
在Java中,参数校验是非常重要的,因为它可以确保方法或函数在执行时接收到的参数是合法的,有效的,从而提高代码的健壮性和安全性。参数校验可以防止无效的输入导致的异常或错误,同时也能减少因为无效参数导致的安全漏洞
Java中的参数校验可以通过手动编写校验逻辑来实现,但这样会增加代码的复杂度和重复性。为了简化参数校验的实现,可以使用Validation API,它是Java EE平台的一部分,提供了一套标准的参数校验机制,可以通过注解的方式来定义参数校验规则。
一、 pom文件引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.7.13</version>
</dependency>
二、使用说明
Controller层
@RequestBody参数校验
@RequestParam/@PathVariable参数校验
编程式校验,直接调用hibernate的validate方法(这里不讲)
@Data
@TableName(value = "crs_car_type")
public class CrsCarType implements Serializable {
private static final long serialVersionUID = -40442116833830864L;
private Integer id;
/**
* 类型名称
*/
@NotNull(message = "类型不能为空")
private String typeName;
/**
* 起价
*/
@Min(200)
private String startPrice;
@NotNull
private Date addtime;
private String url;
}
controller层注明要校验的地方
@GetMapping("{id}")
public Result queryById(@Max(15) @PathVariable("id") Integer id) {
return Result.success(crsCarTypeService.queryById(id));
}
/**
* 新增数据
*
* @param crsCarType 实体
* @return 新增结果
*/
@Transactional
@ApiOperation(value = "新增", notes = "新增")
@PostMapping("/add")
public Result add(@RequestBody @Validated CrsCarType crsCarType) {
return Result.success(crsCarTypeService.insert(crsCarType));
}
进阶使用
可以自定义注解实现ConstraintValidator
多属性注解 比如根据甲注解判断乙注解
嵌套校验 在对象属性上使用@Valid
常用注解如下
@NotNull:用于校验字段值不能为null。
@NotEmpty:用于校验集合或字符串不能为空,但可以是空字符串。
@NotBlank:用于校验字符串不能为空,并且长度必须大于0。
@Size:用于校验集合、数组或字符串的大小必须在指定范围内。
@Min:用于校验数字的最小值。
@Max:用于校验数字的最大值。
@DecimalMin:用于校验数字的最小值,包括边界值。
@DecimalMax:用于校验数字的最大值,包括边界值。
@Digits:用于校验数字的整数部分和小数部分的位数。
@Pattern:用于校验字符串是否匹配指定的正则表达式。
@Email:用于校验字符串是否为有效的电子邮件地址。
@Future:用于校验日期必须是将来的日期。
@Past:用于校验日期必须是过去的日期。
@AssertTrue:用于校验字段必须为true。
@AssertFalse:用于校验字段必须为false。
@NotNull:用于校验字段值不能为null。
@Valid:用于嵌套校验,对对象的属性进行校验。
@CreditCardNumber:用于校验字符串是否为有效的信用卡号。
@URL:用于校验字符串是否为有效的URL。
@Positive, @PositiveOrZero, @Negative, @NegativeOrZero:用于校验数字是否为正数、非正数、负数、非负数等。
在Spring框架中,@RequestBody注解用于将HTTP请求的body部分映射到方法的参数上,并且通常用于接收JSON格式的请求数据。当使用@RequestBody注解进行参数校验时,通常会结合使用Validation API的注解来定义校验规则。
三、原理
实现@RequestBody参数校验的原理如下:
配置Validation依赖:首先需要在项目中引入Validation API的依赖,通常是通过引入Hibernate Validator等实现来扩展Validation API的功能。
定义校验规则:在接收@RequestBody参数的POJO类中,可以使用Validation API的注解来定义校验规则,例如@NotNull、@Size、@Pattern等。
启用校验功能:在Spring配置类中,需要配置一个javax.validation.Validator对象,通常是通过LocalValidatorFactoryBean来实现,以便在Spring容器中启用参数校验功能。
开启校验注解支持:在Spring配置类中,需要使用@EnableWebMvc注解来开启对校验注解的支持,这样Spring MVC就能够识别和处理方法参数上的校验注解。
执行校验:当接收到带有@RequestBody注解的方法请求时,Spring MVC会自动对请求的JSON数据进行反序列化,并且将其转换为对应的POJO对象。然后,Spring MVC会利用Validation API对这个POJO对象进行校验,校验结果会被存储在BindingResult对象中。
处理校验结果:在方法内部,可以通过检查BindingResult对象来获取校验结果,如果有校验错误,可以根据具体的业务逻辑进行处理,例如返回错误信息给客户端。
@RequestParam和@PathVariable参数的校验实现原理
下面是对@RequestParam和@PathVariable参数校验实现原理的具体描述:
定义校验规则:在方法的@RequestParam或@PathVariable注解的参数上,可以使用Validation API的注解来定义校验规则,例如@NotNull、@Size、@Pattern等。
启用校验功能:在Spring配置类中,需要配置一个javax.validation.Validator对象,通常是通过LocalValidatorFactoryBean来实现,以便在Spring容器中启用参数校验功能。
开启校验注解支持:在Spring配置类中,需要使用@EnableWebMvc注解来开启对校验注解的支持,这样Spring MVC就能够识别和处理方法参数上的校验注解。
执行校验:当接收到带有@RequestParam或@PathVariable注解的方法请求时,Spring MVC会自动解析请求的URL参数或路径变量,并且将其转换为对应的方法参数。然后,Spring MVC会利用Validation API对这些参数进行校验,校验结果会被存储在BindingResult对象中。
处理校验结果:在方法内部,可以通过检查BindingResult对象来获取校验结果,如果有校验错误,可以根据具体的业务逻辑进行处理,例如返回错误信息给客户端