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

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Lombok并不提供参数校验的功能,但是我们可以结合使用Lombok和Java Bean Validation API来实现参数校验Java Bean Validation API提供了一套API,可以在JavaBean中使用注解来进行参数校验。我们可以在Lombok生成的Getter和Setter方法上添加注解,通过使用Java Bean Validation API进行参数校验。 举个例子,我们可以在一个User类的属性上添加注解@NotNull来表示该属性不能为空: ```java import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotNull; @Getter @Setter public class User { @NotNull(message = "用户名不能为空") private String username; private String password; } ``` 接下来,我们可以在调用Setter方法之前对参数进行校验: ```java import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; public class UserService { private Validator validator; public UserService() { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); validator = validatorFactory.getValidator(); } public void addUser(User user) { Set<ConstraintViolation<User>> violations = validator.validate(user); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } // 添加用户 } } ``` 在上面的代码中,我们首先获取一个Validator对象,然后在添加用户时调用validate方法进行参数校验。如果有校验不通过的情况,我们可以抛出一个ConstraintViolationException异常来提示用户。 需要注意的是,为了使用Java Bean Validation API进行参数校验,我们需要在项目中添加javax.validation:validation-api和Hibernate Validator的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值