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;

}

  

 

 

 

 
posted @ 2018-07-23 19:36  七分饱  阅读(1075)  评论(0编辑  收藏  举报