分布式项目-品牌管理(7)

news2024/11/15 1:34:39

【今日成果】:

//啊哈哈哈 , 莫名其妙入选了。
在这里插入图片描述
在这里插入图片描述

【快速回顾】:

(1):
虽然提交表单的时候前端做了校验,但是通过PostMAN接口调试,我们发现不规范的数据还是会被存储到数据库中;——需要做后端校验;
(2):
不能在每一个Controller接口上都加上那么一大堆代码,这个时候就需要使用统一异常处理;
(3):
关于code , 随着后面开发的模块越来越多 , 返回的CODE需要区分开来。——这就涉及到编码规则的制定。
(4):
同一个实体类不同的操作对同一个字段的要求是不同的 , 例如ID , 添加的时候不需要校验 ,但是修改的时候就必须得进行非空判断,这个时候就得使用——分组校验;
(5):
自定义校验注解。
(6):
SKU 和 SPU 。

【具体细节】:

【后端校验】:

(1):传入实体对象后,使用if…else…来逐个字段校验;
(2):使用JSR-303 ;

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@Valid  @RequestBody  BrandEntity brand , BindingResult result){
        if (result.hasErrors()){
            //提交的数据经过JSR303后 , 有非法的字段。
            Map<String,String> map = new HashMap<>();

            List<FieldError> fieldErrors = result.getFieldErrors();
            

            for ( FieldError fieldError : fieldErrors ) {
                //获取提交的不合法数据的field
                String field = fieldError.getField();
                //获取非法的field提示信息
                String defaultMessage = fieldError.getDefaultMessage();
                map.put( field , defaultMessage );
            }
            return R.error(400,"提交的品牌表单数据不合法").put("data",map);
        }
		brandService.save(brand);

        return R.ok();
    }

【实体类上的注解信息】:

@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	@TableId
	private Long brandId;

	@NotEmpty(message = "品牌的名称不能为空")
	private String name;

	@URL(message = "logo必须是一个合法的URL地址")
	@NotEmpty(message = "LOGO不能为空")
	private String logo;

	@Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是单个的字母")
	@NotEmpty(message = "检索首字母不能为空")
	private String firstLetter;

	@Min(value=0 , message = "排序不能小于0")
	@NotNull(message = "排序字段不能为null                                                  ")
	private Integer sort;
}

【统一异常处理】:

通用的错误列表 , 响应的编码统一为5位数字 , 前面两位约定为业务场景 , 最后三位约定为错误码;
10——表示通用;
/001:参数格式错误 10001

/002:未知异常 10002

11:商品

12:订单

13:物流

14:会员

/*
* 错误编码 和 错误信息的枚举类
* */
public enum BizCodeEnume {

    UNKNOW_EXCEPTION(10000,"系统未知异常"),
    VALID_EXCEPTION(10001,"参数格式异常");

    private int code;
    private String msg;

    BizCodeEnume(int code,String msg){
        this.code = code;
        this.msg = msg;
    }
    public int getCode(){
        return code;
    }

    public String getMsg(){
        return msg;
    }
}

【分组异常处理】:

在这里插入图片描述

	/**
	 * 品牌id
	 */
	@NotNull(message = "更新数据品牌ID必须不为空",groups = {UpdateGroupsInterface.class})
	@Null(message = "添加品牌信息品牌ID必须为空",groups = {AddGroupsInterface.class})
	@TableId
	private Long brandId;

【Controller中的代码】:

在这里插入图片描述

【接口】:

【Update】:

【Add】:

【注意】:

一旦指定了分组,那么没有分组的注解就会失效;
在这里插入图片描述
如果没有红色区域的注解,只有蓝色的注解 , 那么蓝色的注解会起作用;
但是一旦使用了红色区域的注解,那么———蓝色区域的注解就不会再起作用(因为启用了分组);

【自定义校验注解】:

(1):创建自定义的校验注解;

/**
 * 自定义的校验注解
 */
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {

    String message() default "提交的数据必须在数据列表中";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    int[] val() default {};
}

(2):创建一个自定义的校验器;

/**
 * 对应的校验注解的校验器
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
    private HashSet<Integer> set = new HashSet<>();
    /**
     * 初始化的方法
     * 举例:@ListValue(val={1,0})
     * 获取到 1 0
     * @param constraintAnnotation
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] val = constraintAnnotation.val();// 0 1
        for (int i : val) {
            set.add(i);
        }
    }

    /**
     * 判断校验是否成功的方法
     * @param value 客户端传递的对应的属性的值 判断value是否在0 , 1 中
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

(3):关联自定义的校验注解和校验器。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端基础知识6

谈谈你对语义化标签的理解语义化标签就是具有语义的标签&#xff0c;它可以清晰地向我们展示它的作用和用途。 清晰的代码结构&#xff1a;在页面没有css的情况下&#xff0c;也能够呈现出清晰的代码内容 有利于SEO: 爬虫依赖标签来确定关键字的权重&#xff0c;因此可以和搜索…

Android 一体机研发之修改系统设置————声音

Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了&#xff01; 本章将为大家细节讲解声音。 对于声音功能大家都不陌生&#xff0c;在多…

Java虚拟机(JVM)调优思路

title: Java虚拟机&#xff08;JVM&#xff09;调优思路 date: 2022-04-09 00:00:00 tags: JVM性能调优 categories:Java 调什么 内存方面 JVM需要的内存总大小各块内存分配&#xff0c;新生代、老年代、存活区选择合适的垃圾回收算法、控制GC停顿次数和时间解决内存泄露的问…

Appium移动自动化测试——app控件获取之uiautomatorviewer

下载手机YY http://yydl.duowan.com/mobile/yymobile_client-android/5.4.2/yymobile_client-5.4.2-881.apk 若链接失效&#xff0c;请自行百度 新建maven空白工程 前置条件&#xff1a;安装eclipse&#xff0c;及其maven插件&#xff0c;请自行百度 新建的工程如下&#xf…

Kylin查询下压的设置、Sparder查询引擎详细介绍、HDFS文件目录含义

目录1. 查询下压设置2. Sparder查询引擎详细介绍3. HDFS文件目录含义1. 查询下压设置 如果未开启查询下压&#xff0c;则查询有很多限制。这是因为只能查询cube中的数据&#xff0c;而不能通过spark sql查询Hive中的源数据 开启查询下压&#xff0c;优先从cube中查询数据&…

百度前端常考vue面试题(附答案)

怎么实现路由懒加载呢 这是一道应用题。当打包应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问时才加载对应组件&#xff0c;这样就会更加高效 // 将 // import UserD…

因新硬件支持内核问题Ubuntu 22.04.2推迟发布

导读Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周&#xff0c;定于 2 月 23 日发布。 Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周&#xff0c;定于 2 月 23 日发布。 Canonica…

2023全网最火的接口自动化测试,一看就会

目录 接口自动化测试用例设计Excel接口测试用例访问MySQL接口测试用例访问PyTest测试框架接口自动化测试必备技能-HTTP协议request库实现接口请求 引言 与UI相比&#xff0c;接口一旦研发完成&#xff0c;通常变更或重构的频率和幅度相对较小。因此做接口自动化的性价比更高&…

AI是超越还是桎梏?从ChatGPT到5G+AI,我们在聊什么?

从家常里短聊到科技创新&#xff0c;从人文故事探讨到物理科学&#xff0c;诞生2个月用户即破亿的ChatGPT正成为火爆全球的AI应用工具&#xff0c;其强大的能力超乎人们想象。这款几乎博学多识的聊天机器人能运用AI系统进行简洁的交流&#xff0c;完成各种指令信息的表达。面对…

Prometheus 自动发现监控AWS EC2实例

本文章简述对接自动发现AWS云EC2实例 前提环境&#xff1a; PromethuesGrafanaAWS IAM权限 涉及参考文档&#xff1a; AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则&#xff1a; {"Version": "2012-10-17",&quo…

【实际开发18】- 静态 3

目录 1. 调试与评估 2. 单元测试的管理 1. 单元测试的文档 3. 系统集成的模式与方法 1. 集成测试前的准备 2. 集成测试的模式 3. 大棒集成方法 ( Big-bang Integration) 4. 自顶向下和自底向上集成方法 1. 自顶向下法 ( Top-down Integration ) 2. 自底向上法 ( Bott…

linux如何查看编译器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(编译时不指定g++版本,默认使用老版本编译)

文章目录C各个版本C11C14C17C20查看自己的编译器支持C哪个版本注意&#xff1a;编译时不指定g版本&#xff0c;默认使用老版本编译&#xff08;存疑&#xff09;C各个版本 C11 C11是一个重要的C标准版本&#xff0c;于2011年发布。C11带来了许多重要的改进&#xff0c;包括&a…

vue3封装数值动态递增组件

vue3封装数值动态递增组件前言源码举个例子&#xff1a;前言 1&#xff09;使用技术&#xff1a; vue3.2 Ts 2&#xff09;组件接收参数&#xff1a; 参数类型意义是否可选valuenumber数值大小必填durationnumber递增动画持续时间&#xff08;单位&#xff1a;s&#xff09;…

PyTorch学习笔记

PyTorch学习笔记&#xff08;一&#xff09;&#xff1a;PyTorch环境安装 往期学习资料推荐&#xff1a; 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 安装参考&#xff1a; 1.视频教程&#xff1a;3分钟深度学习【环境搭建】CUDA Anacon…

javascript测试二

一、 选择题&#xff08;共10题&#xff0c;每题2分&#xff09;1、在JavaScript中&#xff0c;想要一次跳出方法的多层循环结构需要用&#xff08;C &#xff09; A) breakB) continueC) returnD) false2、 下列关于嵌套循环以下说法正确的一项是(A )。A) 每一种循环结构内部也…

Elipse报错:Failed to load the JNI shared library jvm.dll解决方法

情景 导入Elipse的项目中有jar包和64位版本的JDK不兼容。 于是我安装了32位版本的JDK。 配置好系统环境后&#xff0c;重启Eclipse却遇到了这个问题。 原因 搜索后了解到&#xff0c;是因为Eclipse版本与JDK版本不匹配。 我的Eclipse是64位的&#xff0c;但JDK配置是32位的…

科技云报道:2023年,可观测性迎来哪些新趋势?

科技云报道原创。 可观测性不是一个新鲜的名词&#xff0c;但是近年来随着云原生技术的发展&#xff0c;在带来效率、可用性提升的同时也增加了复杂度&#xff0c;而可观测性成为降低这种复杂度的唯一手段&#xff0c;因此被推到了前所未有的重要地位。 Gartner将应用可观测…

前端面试常考 | 浅拷贝与深拷贝

文章目录一. 前言1. 概述2. 数据类型3. 存储区别二. 深浅拷贝1.深浅拷贝的定义2. 基本数据类型的拷贝3. 引用类型的拷贝4. 实现 “浅” 拷贝1. Object.assign()2. slice()3. concat()方法4. es6展开运算符5. 实现 “深” 拷贝1. JSON.parse(JSON.stringify(obj))2. lodash3. 递…

ASEMI代理FGH60N60,安森美FGH60N60车规级IGBT

编辑-Z 安森美FGH60N60车规级IGBT参数&#xff1a; 型号&#xff1a;FGH60N60 集电极到发射极电压&#xff08;VCES&#xff09;&#xff1a;600V 栅极到发射极电压&#xff08;VGES&#xff09;&#xff1a;20V 收集器电流&#xff08;IC&#xff09;&#xff1a;120A 二…

2023年1月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年1月国产数据库大事件和重要产品发布消息。 目录 1月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证排行榜新增数据库厂商活动相关资料 1月国产数据库大事记&#xff08;时间线&#xff09; 1月6日消息&#xff0c;近日…