validation 实现参数校验

简述
在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对象来获取校验结果,如果有校验错误,可以根据具体的业务逻辑进行处理,例如返回错误信息给客户端

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值