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