zoukankan      html  css  js  c++  java
  • Springboot 手动搭建项目 --valication的使用

    最近一直在学springboot和Cloud,互联网公司现在也更倾向于微服务这一块,前景是一篇光明的,特别是在springboot上开发的Cloud的部分,是一套分布式的整体解决方案,学好这一块至少这几年都很吃香;

    既然学习很久,落地实践一下为好;

    项目git网址:https://github.com/David-BIQI/manage.git(项目使用比较新的springboot2.0 还有jdk8 )

    参照的代码规范:https://github.com/xwjie/PLMCodeTemplate.git (这个是一套能够落地的代码规范,跟着风哥学习很多)

    • 校验数据
    1. controer层的数据校验,直接对传入的数据进行校验,比如数据的格式,必填值,是否符合正则
    2. service层的数据校验,主要是修改前数据是否存在,状态是否可以修改,是否重名判断等
    3. dao层基本不做数据的校验,默许传入dao层的数据是安全的
    • 配置
    1. 使用的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;
    
    }
    

      

     
  • 相关阅读:
    育碧-彩虹六号如何绑定二次验证码/两步验证/身份验证?
    leetcode刷题-95/96/98
    leetcode刷题-94二叉树的中序遍历
    leetcode刷题-93复原IP地址
    leetcode刷题-91解码方法
    leetcode刷题-90子集 II
    leetcode刷题-89格雷编码
    leetcode刷题-88.合并两个有序数组
    leetcode刷题-86分隔链表
    leetcode刷题-82.删除排序链表中的重复元素 II
  • 原文地址:https://www.cnblogs.com/xiebq/p/9231841.html
Copyright © 2011-2022 走看看