谷粒商城之商品服务-品牌管理

品牌管理前端页面校验功能

表单校验&自定义校验器

错误记录:启动第三方服务的时候报了个错

错误:

Error creating bean with name 'configDataContextRefresher' defined in class path resource

 出现原因:版本冲突

谷粒商城之商品服务-品牌管理_第1张图片

谷粒商城之商品服务-品牌管理_第2张图片

谷粒商城之商品服务-品牌管理_第3张图片

谷粒商城之商品服务-品牌管理_第4张图片

 解决方案:将cloud的版本改为Hoxton.SR12

测试品牌管理的新增功能

谷粒商城之商品服务-品牌管理_第5张图片

开关按钮需要动态绑定0/1而不是true/false 

谷粒商城之商品服务-品牌管理_第6张图片

 品牌新增成功之后,logo地址应显示图片而不是图片访问的路径

使用table的自定义模板 

谷粒商城之商品服务-品牌管理_第7张图片

谷粒商城之商品服务-品牌管理_第8张图片 谷粒商城之商品服务-品牌管理_第9张图片 

 使用el-image组件显示图片

谷粒商城之商品服务-品牌管理_第10张图片

谷粒商城之商品服务-品牌管理_第11张图片

出现问题: el-image组件没有注入

解决方案: 将el-image组件注入进来

将其内容复制到项目的src\element-ui\index.js中,导入的内容:只要导入组件和使用组件即import和use

谷粒商城之商品服务-品牌管理_第12张图片

 谷粒商城之商品服务-品牌管理_第13张图片

 出现问题:有些组件找不到

谷粒商城之商品服务-品牌管理_第14张图片

解决方案: 将其删除

出现问题:contain为定义

解决方案:不需要动态绑定fit,将其写死

谷粒商城之商品服务-品牌管理_第15张图片

谷粒商城之商品服务-品牌管理_第16张图片

 图片还是无法正常显示,使用el-image组件失败

改用原生的img来实现效果

谷粒商城之商品服务-品牌管理_第17张图片

 新增功能改善,添加校验功能

谷粒商城之商品服务-品牌管理_第18张图片

默认的校验功能就是不能为空,显然,不符合我们需求 。其中,检索首字母必须是a-zA-Z中的一个并且个数只能是一个,排序必须是数字等等

谷粒商城之商品服务-品牌管理_第19张图片

为表单动态绑定校验规则 

设置规则 

required:true 即必须的,message:提示信息,trigger:触发条件 ,trigger:'blur'即失去焦点触发 

谷粒商城之商品服务-品牌管理_第20张图片

 自定义校验器

谷粒商城之商品服务-品牌管理_第21张图片

通过使用validator来自定义校验器

谷粒商城之商品服务-品牌管理_第22张图片

 谷粒商城之商品服务-品牌管理_第23张图片

为检索首字母和排序自定义校验器 

给sort和showStatus一个默认值

谷粒商城之商品服务-品牌管理_第24张图片

自定义校验器

谷粒商城之商品服务-品牌管理_第25张图片 测试 

谷粒商城之商品服务-品牌管理_第26张图片

JSR303数据校验

JSR303是后端校验数据的一种规范

使用JSR303数据校验的步骤:

①导入SpringBoot整合JSR303的依赖



   org.springframework.boot
   spring-boot-starter-validation

常用JSR303注解的作用:

 Bean Validation 中内置的constraint

谷粒商城之商品服务-品牌管理_第27张图片

 谷粒商城之商品服务-品牌管理_第28张图片

 Hibenate Validator中额外附加的 constriant

谷粒商城之商品服务-品牌管理_第29张图片

 每个注解注释文档中都有其作用和适用类型,我们标记注解时可以参考注释文档

谷粒商城之商品服务-品牌管理_第30张图片②为实体类字段标记注解

例如:品牌名不能是个空字符串,我们可以标记@NotEmpty并且可以自定义校验信息

谷粒商城之商品服务-品牌管理_第31张图片

谷粒商城之商品服务-品牌管理_第32张图片

message默认使用的是ValidationMessages_zh_CN.properties中的配置信息,我们可以自定义校验信息

谷粒商城之商品服务-品牌管理_第33张图片

③告诉SpringMVC我们要校验的实体类,通过使用@Valid,如果不使用此注解则我们标记的校验注解不会生效

谷粒商城之商品服务-品牌管理_第34张图片

进行一个测试,看校验注解是否生效

谷粒商城之商品服务-品牌管理_第35张图片 看到status:400就应该知道,这个是校验失败的报错信息。但是,响应体的信息显然并不符合我们的要求,没有错误提示

③使用BindingResult获取校验的信息

/**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Valid  @RequestBody BrandEntity brand, BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            Map map=new HashMap<>();
            // 获取所有的校验错误结果并且进行遍历
            bindingResult.getFieldErrors().forEach((item)->{
                // 1.获取校验错误的字段名
                String name=item.getField();
                //2.获取校验错误信息
                String message=item.getDefaultMessage();
                map.put(name,message);
            });
            return R.error(400,"提交数据不合法").put("data",map);
        }else{
            brandService.save(brand);
            return R.ok();
        }
    }

谷粒商城之商品服务-品牌管理_第36张图片

为BrandEntity的属性设置校验注解 

谷粒商城之商品服务-品牌管理_第37张图片

 谷粒商城之商品服务-品牌管理_第38张图片

谷粒商城之商品服务-品牌管理_第39张图片

统一异常处理

上面讲述了普通校验,如果我们每个方法都写一个普通校验异常信息返回的方法,代码量将会很大。因此,我们需要将controller出现的异常统一处理。

①创建一个统一异常处理的异常类,可以处理任何异常

谷粒商城之商品服务-品牌管理_第40张图片

② 使用ControllerAdvice注解,该注解的作用就是处理controller抛出的异常,并且告诉SpringMVC处理那个包下的controller抛出的异常

谷粒商城之商品服务-品牌管理_第41张图片

③使用Exception注解,该注解的作用是指定处理那个异常类的异常,通过value属性指定

谷粒商城之商品服务-品牌管理_第42张图片

④ 使用Slf4j打印异常信息

谷粒商城之商品服务-品牌管理_第43张图片

将controller中BindingResult删除,因为BindingResult会接受异常对象,删除之后controller出现异常将会自动抛出异常对象

谷粒商城之商品服务-品牌管理_第44张图片

谷粒商城之商品服务-品牌管理_第45张图片 查看打印的log,获取到了精确的异常类

​​异常对象class org.springframework.web.bind.MethodArgumentNotValidException

 将异常类的类型精确

⑤将异常信息以jason格式返回

谷粒商城之商品服务-品牌管理_第46张图片

由于每个处理异常的方法最后都是要以jason的格式返回,所以将ResponseBody注解标注在类上 

谷粒商城之商品服务-品牌管理_第47张图片

最后,RestControllerAdvice=ResponseBody+ControllerAdvice

谷粒商城之商品服务-品牌管理_第48张图片

 谷粒商城之商品服务-品牌管理_第49张图片

在实际开发中我们需要去定义一个通用的错误码,例如

1.错误码为5位数字

2.错误码前两位表示业务场景,后三位表示错误类型。例如:10001,10:通用 001:表示参数格式校验

3.光有错误码还不够,还需要错误信息,我们将错误信息以枚举类的形式定义

10:通用   11:商品   12:订单   13:购物车   14:物流

错误码首先是通用的,因此,在common模块中创建错误码枚举类 

谷粒商城之商品服务-品牌管理_第50张图片

谷粒商城之商品服务-品牌管理_第51张图片

将统一异常处理类的进行修改

谷粒商城之商品服务-品牌管理_第52张图片

谷粒商城之商品服务-品牌管理_第53张图片

JSR3030分组校验(多场景的复杂校验)

分组校验的作用:在不同场景下校验的规则肯定是不同的,例如BrandId在新增场景下必须为Null由于主键自增而在修改情况下必须携带,分组属性的作用就是区分不同情况下的校验规则。

①在common中创建接口,无需实现,用于标识校验场景

谷粒商城之商品服务-品牌管理_第54张图片

② 使用注解中的group属性,标识校验的场景

谷粒商城之商品服务-品牌管理_第55张图片

谷粒商城之商品服务-品牌管理_第56张图片

③使用@Validated注解确定校验场景

谷粒商城之商品服务-品牌管理_第57张图片

测试:

谷粒商城之商品服务-品牌管理_第58张图片

排序字段未标识分组情况,因此,校验注解不生效。 

说明:未标识分组情况的注解并不生效,只有在@Validated注解未标识group属性时生效

将排序字段标识校验场景

谷粒商城之商品服务-品牌管理_第59张图片

JSR303自定义校验注解 

自定义注解的作用:showStatus属性的值要么0要么1,一种选择是使用正则表达式,但很多时候正则表达式并不能解决我们需求的校验功能,因此,需要自定义校验

自定义校验的步骤:

1.编写一个自定义注解

可以参考JSR303规范的注解,例如:NotNull

谷粒商城之商品服务-品牌管理_第60张图片

Target注解:用于指定此注解可以标记在什么位置

Retention注解:指定此注解的生命周期

Constraint注解:用于关联此注解和校验器

①导入自定义校验需要的依赖


    javax.validation
    validation-api
    2.0.1.Final

②自定义注解首先要满足JSR303的规范,即要有message、groups、Payload三个属性

谷粒商城之商品服务-品牌管理_第61张图片

② 自定义注解

谷粒商城之商品服务-品牌管理_第62张图片

谷粒商城之商品服务-品牌管理_第63张图片 谷粒商城之商品服务-品牌管理_第64张图片 

③编写一个配置文件,配置message默认信息

message默认是从以下这个配置文件获取默认信息的

 我们可以自己编写一个配置文件

谷粒商城之商品服务-品牌管理_第65张图片

自定义信息可以在注解的message属性中自己编写 

2.编写一个自定义校验器

①自定义校验器要实现ConstraintValidator接口,接口中的两个泛型分别指:需要校验的注解和注解需要校验的数据类型

谷粒商城之商品服务-品牌管理_第66张图片

因此,编写ZeroOrOne注解的校验器,第一个泛型指的是ZeroOrOne注解,第二泛型指的是需要校验的数据类型即Integer

谷粒商城之商品服务-品牌管理_第67张图片

编写ZeroOrOne注解的校验器 

谷粒商城之商品服务-品牌管理_第68张图片

谷粒商城之商品服务-品牌管理_第69张图片

接口定义了两个方法,一个是初始化方法,一个是校验方法 。其中,初始化方法的参数是一个ZeroOrOne注解的对象也就可以获取对象的属性,校验方法的第一个参数就是传递进来需要校验的数据

谷粒商城之商品服务-品牌管理_第70张图片

谷粒商城之商品服务-品牌管理_第71张图片

完善校验器功能

public class ZeroOrOneConstraintValidator implements ConstraintValidator {
    
    HashSet set=new HashSet<>();

    // 初始化方法
    @Override
    public void initialize(ZeroOrOne constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        int[] arrs=constraintAnnotation.value(); // 获取value的值,这里是指0,1
        for (int i:arrs){ 
            set.add(i);  // 将value的值封装进set中
        }
    }

    // 返回校验是否正确的校验方法
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        if (integer != null){  // 对integer进行一个非空判断
            if (set.contains(integer)){  // 判断校验的数值是不是在set中
                return true;
            }else {
                return false;
            }
        }else {
            return false;
        }
    }
}

3.关联校验器和注解

谷粒商城之商品服务-品牌管理_第72张图片说明: 目前我们只编写了对Integer数据的校验的校验器,如果需要对其它类型的数据进行校验的话,只需要编写相对应的校验器和进行注解和校验器关联即可,说直白一点就是你写了不同功能的校验器你往关联注解中加就行,至于用哪个校验器就不用我们操心了

你可能感兴趣的:(尚硅谷谷粒商城,JSR303,谷粒商城品牌管理)