Validation配置类

引言

在实际项目我们需要对客户端传递到服务端的参数进行校验,用于判定请求参数的合法性,假如请求参数不合法, 不可以再去执行后续的业务了。那如何校验呢?一种方式是我们在控制层方法中每次都自己进行参数有效值的判断, 不合法可以抛出异常,但是工作量和代码复杂度会比较高。第二种方式就是采用市场上主流的Spring Validation 框架去实现校验。

Spring Validation的基本应用

第一步:添加依赖

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

第二步:通过注解对Controller类、方法参数、dto对象中的属性进行描述

对WeiboDTO中的Content属性进行NotNull标注

@Data
public class WeiboDTO {
    // 微博内容
    @NotBlank(message = "content can not be empty string") //不允许为空串
    private String content;
}

对WeiboController方法中的参数添加@Validated注解描述

    @PostMapping("insert")
    @ApiOperation(value = "发布微博功能")
    public int insert(@Validated @RequestBody WeiboDTO weiboDTO, @ApiIgnore HttpSession session){
    }

第三步:访问WeiboController中的insert方法,给content传null,检测访问效果。

POST http://localhost:8080/v1/weibo/insert
Content-Type: application/json

{
  "content": ""
}

第四步:自己做(可以通过搜索引擎自己进行拓展)-下午模拟面试结束 1)如何对验证时出现的异常进行处理。(重点)

/**
* 对参数校验异常进行处理
* @param ex
* @return
*/
@ExceptionHandler(BindException.class)
public ResultVO doBindException(BindException ex){
        ObjectError objectError = ex.getBindingResult().getAllErrors().get(0);
        return new ResultVO(StatusCode.VALIDATE_ERROR,
        objectError.getDefaultMessage());
}

查Spring Validation还有那些注解可以应用

@NotNull:不允许为null值 可以用于任何类型 @NotEmpty:不允许为空字符串(长度为0的字符串),并且会检查是否为null值(为null时报错) 仅能用于字符串类型的参数 @NotBlank:不允许为空白,即不允许是“仅由空格、TAB等空白值组成的字符串” 仅能用于字符串类型的参数

@Range:通过配置min和max属性来限制数值类型参数的值区间,它不会检查是否为null(为null并不执行任何检查,且不会报错) 仅能用于整型参数 @Pattern:通过配置regexp属性来配置正则表达式 仅能用于字符串类型的参数

第六步:自己做(可以通过搜索引擎自己进行拓展)-下午模拟面试结束 对于非pojo参数(例如参数列表中的int id)的检查,需要先在当前方法所在的类上添加@Validated注解,例如:

@RestController
@RequestMapping("/v1/weibo/")
@Api(tags = "02.微博模块")
@Slf4j
@Validated
public class WeiboController {

}

然后,可以在参数上添加对应的检查注解,例如:

    @GetMapping("selectById")
    @ApiOperation(value = "微博详情功能")
    @ApiImplicitParam(name="id",value = "微博id",required = true,example = "1",dataType = "int")
    public WeiboDetailVO selectDetail(@Range(min = 1, message = "请提交合法的ID值!") int id){
        //System.out.println("id="+id);
        log.debug("id's value is {}",id);
        if(id==-1)
            throw new IllegalArgumentException("id值无效");
        // 无需校验用户登录状态
        return weiboMapper.selectDetail(id);
    }

最后进行访问测试,输入id值小于1的数据,比对进行进行分析

在项目中需要检查请求参数的格式时,会检查所有属性配置的规则,找出所有的错误,如果希望实现“只要发现错误,就不再向后检查”,需要将其配置为“快速失败”,配置做法是使用配置类

package cn.tedu.csmall.product.config;

import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.validation.Validation;

/**
 * Validation配置类
 *
 */
@Slf4j
@Configuration
public class ValidationConfiguration {

    public ValidationConfiguration() {
        log.debug("创建配置类对象:ValidationConfiguration");
    }

    @Bean
    public javax.validation.Validator validator() {
        return Validation.byProvider(HibernateValidator.class)
                .configure() // 开始配置
                .failFast(true) // 配置快速失败
                .buildValidatorFactory() // 构建Validator工厂
                .getValidator(); // 从Validator工厂中获取Validator对象
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值