最近一直在学springboot和Cloud,互联网公司现在也更倾向于微服务这一块,前景是一篇光明的,特别是在springboot上开发的Cloud的部分,是一套分布式的整体解决方案,学好这一块至少这几年都很吃香;
既然学习很久,落地实践一下为好;
项目git网址:https://github.com/David-BIQI/manage.git(项目使用比较新的springboot2.0 还有jdk8 )
参照的代码规范:https://github.com/xwjie/PLMCodeTemplate.git (这个是一套能够落地的代码规范,跟着风哥学习很多)
-
校验数据
-
controer层的数据校验,直接对传入的数据进行校验,比如数据的格式,必填值,是否符合正则
-
service层的数据校验,主要是修改前数据是否存在,状态是否可以修改,是否重名判断等
-
dao层基本不做数据的校验,默许传入dao层的数据是安全的
-
配置
-
使用的spring的valication的校验
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
如何使用
bean对象上添加上注解,规则和提示
@ApiModelProperty(value = "用户名") @Size(min = 2, max = 8,message="名字长度不必须是2-8个字符",groups = {Login.class}) private String name; @ApiModelProperty(value = "密码") @Size(min = 6, max = 8,message="登陆密码输入长度错误",groups={Login.class}) private String password;
如何分组校验先添加接口interface 定义不用的组,在上面group中使用
package com.biqi.model.validate; /** * Description: 更新时候校验类 * @Package com.biqi.model.validate * @author xiebq @date 2018年6月11日 下午4:25:09 */ public interface Update { }
bean对象上添加分组的信息,见上面bean对象上添加上注解
在controller层传入对象中添加对象BindingResult
@PostMapping("/loginOut") @ApiOperation(value = "退出", notes="退出") public ResultDto<Boolean> loginOut(HttpSession session,@RequestBody @Validated(value = { Login.class }) LoginDto loginDto, BindingResult bindingResult) { hasErrors (bindingResult); ResultDto<Boolean> resultDto = new ResultDto<>(); resultDto.setData(loginService.loginOut(loginDto)); return resultDto; }
/** * 功能:检验传入对象参数-->有异常抛出请求参数异常 4300 * @param bindingResult */ public static void hasErrors(BindingResult bindingResult){ StringBuilder sb = new StringBuilder(); if(bindingResult.hasErrors()) { List<ObjectError> errors = bindingResult.getAllErrors(); errors.forEach(item->sb.append(item.getDefaultMessage()+";")); fail(ReCode.FAIL_PARAMETER_ERROR.getCode(),sb.toString()); } };
友好的提示给前端,aop切异常,这样方法中就不用一直写BindingResult
@ExceptionHandler(value = MethodArgumentNotValidException.class) @ResponseBody public Result methodArgumentNotValidExceptionHandler(HttpServletRequest req, Exception e) { MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e; Result result = new Result(); result.setCode(-998); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("参数校验失败:"); for (FieldError fieldError : exception.getBindingResult().getFieldErrors()) { stringBuilder.append(MessageFormat.format("{0}[{1}],", fieldError.getField(), fieldError.getDefaultMessage())); } result.setMessage(stringBuilder.toString()); return result; }
至此分组校验以及统一的aop处理基本完成,在controller对于传入数据的验证做好。pick up myself!!!
2018.9.1补充实践中发现
@Valid 这个不会检查嵌套对象里面内容
比如入参是ConfigurationIVO 只会检验这个对象中的信息,而不会嵌套检验HotCarBrandIVO,回头继续查看源码的部分
@Data public class ConfigurationIVO { @ApiModelProperty(value = "热门车品牌", required = true) @NotNull private List<HotCarBrandIVO> listHotCarBrandIVO; } @Data public class HotCarBrandIVO { /** * 车品牌编号 */ @ApiModelProperty(value = "车品牌编号", required = true) @NotNull private Long carBrandId; @NotNull private Integer sortNo; }