java参数校验

引入依赖

 <!--参数效验-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
  <!--@Length参数效验-->
     <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

前端参数请求类SysMenu

package com.sky.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;


/**
 * 菜单权限表 sys_menu
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SysMenu extends BaseEntity{
    private static final long serialVersionUID = 1L;
    /** 菜单ID */
    private Long menuId;

    /** 菜单名称 */
    @Length(min=4,max=12,message = "菜单名称在4到12之间")
    @NotBlank(message = "menuName 不能为空")
    private String menuName;

    /** 父菜单ID */
    private Long parentId;

    /** 显示顺序 */
    private String orderNum;

    /** 菜单URL */
    @Length(min=4,max=12,message = "url在4到12之间")
    @NotBlank(message = "url 不能为空")
    private String url;

    /** 打开方式(menuItem页签 menuBlank新窗口) */
    private String target;

    /** 类型(M目录 C菜单 F按钮) */
    private String menuType;

    /** 菜单状态(0显示 1隐藏) */
    private String visible;

    /** 是否刷新(0刷新 1不刷新) */
    private String isRefresh;

    /** 权限字符串 */
    private String perms;

    /** 菜单图标 */
    private String icon;

    /** 子菜单 */
    private List<SysMenu> children = new ArrayList<SysMenu>();


}

参数校验常用注解

除了前四个 @Null,@ NotNull,@ NotBlank,@NotEmpty外,其他所有的注解,传 null 时都会被当作有效处理

注解常用参数值:message(校验不通过反馈信息)

JSR303定义的基础校验类型和Hibernate Validator 中附加的 constraint :@Length,@Range
在这里插入图片描述

全局异常处理@RestControllerAdvice

package com.sky.handler;

import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


import javax.validation.ConstraintViolationException;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice   //是一个用于全局异常处理的注解
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex    @ExceptionHandler注解用于标识一个方法,该方法用于处理由Spring MVC控制器中抛出的异常。当控制器中的代码抛出异常时,Spring MVC会查找具有@ExceptionHandler注解的方法,并执行该方法来处理异常。
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

    /*
    * 处理sql异常  捕获了之后 控制台就不会输出异常信息 直接抛出到前端了
    * */
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
         //Duplicate entry 'zhansan' for key 'employee.idx_username'
        String message=ex.getMessage();
        if(message.contains("Duplicate entry")){
            //根据空格分隔
            String[] split=message.split(" ");
            //取到用户名
            String username=split[2];
            String msg=username+"已存在";
            return Result.error(msg);
        }else {
            //引入常量类字符串 方便后期维护  也可以直接写字符串表示
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }

    /*
    * 添加效验参数异常处理
    * */
    @ExceptionHandler(BindException.class)
    public Result bindExceptionHandler(BindException e){
        log.error("出现了异常!{}",e.getMessage());
        return Result.error(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }

    /*
     * 添加效验参数异常处理get请求参数  技巧:控制台报什么错误 就截取错误的类型来进行捕获
     * */
    @ExceptionHandler(ConstraintViolationException.class)
    public Result violatExceptionHandler(ConstraintViolationException e){
        log.error("出现了异常!{}",e.getMessage());
        /*截取冒号后面的字符串*/
        return Result.error(e.getMessage().split(":")[1]);
    }

}


Contrller使用 @Validated @Valid

package com.sky.controller.admin;

import com.sky.annotation.RequiresPermissions;
import com.sky.dto.SysMenuQueryDTO;
import com.sky.entity.SysMenu;
import com.sky.result.Result;
import com.sky.service.SysMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;


@Validated   //对本类的方法开启验证功能
@RestController
@RequestMapping("/admin/system/menu")
@Api(tags = "菜单栏权限接口")
@Slf4j
public class SysMenuContrller {
    @Autowired
    private SysMenuService sysMenuService;
    /**
     * 查询系统菜单列表
     */
    @GetMapping("/list")
    @RequiresPermissions("postCreateRule,POST")
    @ApiOperation("查询菜单列表")
    public Result<List<SysMenu>> list(SysMenuQueryDTO sysMenuQueryDTO){
        List<SysMenu> sysMenuList=sysMenuService.selectMenuList(sysMenuQueryDTO);
       return Result.success(sysMenuList);
    }

    /**
     * 查询系统菜单树列表
     */
    @GetMapping("/treeselect")
    @ApiOperation("查询菜单树列表")
    public Result<List<SysMenu>> treeselect(){
        List<SysMenu> sysMenuList=sysMenuService.menuTreeData();
        return Result.success(sysMenuList);
    }
    /*
    * 新增保存菜单
    * */
    @PostMapping("/add")
    @ApiOperation("新增菜单")
    public Result addSave(@RequestBody @Valid/*效验后面的参数*/ SysMenu sysMenu){
             log.info("新增菜单:{}",sysMenu);
        //验证菜单名称是否重复
          sysMenuService.insertMenu(sysMenu);
            return Result.success();
    }
    /*
    * 测试参数验证   @NotBlank这个需要和 @Validated 一起使用
    * */
    @GetMapping("/addlist")
    @ApiOperation("参数验证")
    public Result canshu(@NotBlank(message = "name 不能为空") String name){
        log.info("参数验证:{}",name);
        return Result.success();
    }
}


后端统一返回类result

package com.sky.result;

import lombok.Data;
import java.io.Serializable;

/**
 * 后端统一返回结果
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {

    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pycharm手动安装ini插件

pycharm中新增pytest.ini文件时发现&#xff0c;文件的图标不是配置文件的图标 原因是没有安装ini插件 安装插件的方式有很多种&#xff0c;今天通过去官网下载插件&#xff0c;再安装的方式 第一步&#xff1a;去官网搜索&#xff0c;地址是&#xff1a;https://plugins.jet…

【Java 集合】LinkedBlockingQueue

LinkedBlockingQueue, 顾名思义: 基于链表的阻塞队列, 位于 JUC (java.util.concurrent) 下, 是一个线程安全的集合, 其本身具备了 不支持 null 元素: 存入 null 元素会抛出异常固定不限容量: 在不手动设置容量时, 最大可以支持 Integer.MAX_VALUE 个元素, 也就是理论上的无限个…

MapReduce 基础实战

文章目录 第1关&#xff1a;成绩统计第2关&#xff1a;文件内容合并去重 第1关&#xff1a;成绩统计 编程要求 使用MapReduce计算班级每个学生的最好成绩&#xff0c;输入文件路径为/user/test/input&#xff0c;请将计算后的结果输出到/user/test/output/目录下。 测试说明 …

去掉乘法运算的加法移位神经网络架构

[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码&#xff1a;https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度…

Python之math模块常用方法汇总

python中math模块常用的方法整理 ceil:取大于等于x的最小的整数值&#xff0c;如果x是一个整数&#xff0c;则返回x copysign:把y的正负号加到x前面&#xff0c;可以使用0 cos:求x的余弦&#xff0c;x必须是弧度 degrees:把x从弧度转换成角度 e:表示一个常量 exp:返回mat…

docker制作php5.4运行环境镜像

1.下载镜像 docker pull centos:7或者在控制面板下 2.运行centos7镜像的容器&#xff0c;edncenos7 是新生成的容器名称 ## --name 新名字 docker run -it --name edncenos7 c9a1fdca3387 /bin/bash3.在容器内下载php5.4等插件&#xff0c;以便提交成为新镜像 wget --no-ch…

亚信安慧AntDB数据库——助力5G计费核心替换,全面自主可控

数字经济时代&#xff0c;5G以更快、更丰富、更智能的连接方式服务于各行各业。AntDB数据库&#xff0c;源于亚信科技&#xff0c;自2008年起成功落地全国24个省份的中国移动、中国电信、中国联通和中国广电等运营商项目&#xff0c;为数字化服务和信息化基础建设提供支持。 在…

精选猫咪最爱:五款性价比超高的猫罐头品牌大PK!

新手养猫很容易陷入疯狂购买的模式&#xff0c;但有些品牌真的不能乱买&#xff01;现在的大环境不太好&#xff0c;我们需要学会控制自己的消费欲望&#xff0c;把钱花在刀刃上&#xff01;现在宠物市场真的很内卷&#xff0c;很多品牌都在比拼产品的数据和营养成分。很多铲屎…

大数据讲课笔记5.1 初探MapReduce

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;MapReduce核心思想&#xff08;二&#xff09;MapReduce编程模型&#xff08;三&#xff09;MapReduce编程实例——词频统计思路1、Map阶段&#xff08;映射阶段&#xff09;2、Reduce阶段&#xff08…

STM32启动流程详解(超全,startup_stm32xx.s分析)

单片机上电后执行的第一段代码 1.初始化堆栈指针 SP_initial_sp 2.初始化 PC 指针Reset_Handler 3.初始化中断向量表 4.配置系统时钟 5.调用 C 库函数_main 初始化用户堆栈&#xff0c;然后进入 main 函数。 在正式讲解之前&#xff0c;我们需要了解STM32的启动模式。 STM32的…

透视数据:数据可视化工具的多重场景应用

数据可视化工具已经成为了许多领域中的重要利器&#xff0c;它们在各种场景下发挥着重要作用。下面我就以可视化从业者的角度简单谈谈数据可视化工具在不同场景下的应用&#xff1a; 企业数据分析与决策支持 在企业层面&#xff0c;数据可视化工具被广泛应用于数据分析和决策…

27jd网卡丢失IP地址问题追踪

一、问题描述及复现步骤 问题描述 启用network服务&#xff0c;关闭NetworkManager服务后&#xff0c;&#xff08;通过 ip a 查看&#xff09; em1网卡丢失IP地址 网络相关组件信息 glib-networking-2.58.0-7.ky10.x86_64 network-scripts-10.01-6.ky10.x86_64 dracut-…

MapReduce综合应用案例 — 电信数据清洗

文章目录 第1关&#xff1a;数据清洗 第1关&#xff1a;数据清洗 测试说明 平台会对你编写的代码进行测试&#xff1a; 评测之前先在命令行启动hadoop&#xff1a;start-all.sh&#xff1b; 点击测评后MySQL所需的数据库和表会自动创建好。 PhoneLog&#xff1a;封装对象 L…

Android定制ROM简介

Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前&#xff0c;让我们先了解一些基础知识。 什么是操作系统&#xff1f; 维基百科对此的定义简洁而…

探讨二维半导体的概念、应用前景及其与传统半导体的差异

当探讨二维半导体时&#xff0c;我们置身于科技革新的前沿。这种材料以其纳米级薄度和独特电学性质区别于传统半导体&#xff0c;引发了科学界的广泛兴趣。本文将深入探讨二维半导体的概念、应用前景及其与传统半导体的差异。 什么是二维半导体&#xff1f; 二维半导体是由单…

计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签

文章目录 5 IPv65.1 组成5.2 IPv6地址5.3 从IPv4向IPv6过渡5.3.1 双协议栈5.3.2 隧道技术 6 因特网的路由选择协议6.1 内部网关协议RIP6.2 内部网关协议 OSPF基本特点 6.3 外部网关协议 BGP6.3.1 路由选择 6.4 路由器组成6.4.1 基本了解6.4.2 结构 7 IP多播7.1 硬件多播7.2 IP多…

0062-Java运算符

文章目录 1.运算符介绍2.算术运算符2.1 介绍2.2 细节说明 3.关系运算符(比较运算符)3.1 介绍3.2 细节说明 4.逻辑运算符4.1 介绍4.2 逻辑运算规则4.3 && 和 & 基本规则4.4 && 和 & 使用区别4.5 || 和 | 基本规则4.6 || 和 | 使用区别 5. ! 取反 基本规…

Logback简介与配置详解

在开发和维护Spring Boot应用程序时&#xff0c;一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback&#xff0c;一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。 Logback简介 官方网址&#xff1a;https://logback.qos.ch/ …

Kafka核心参数(带完善)

客户端 api Kafka提供了以下两套客户端API HighLevel(重点)LowLevel HighLevel API封装了kafka的运行细节&#xff0c;使用起来比较简单&#xff0c;是企业开发过程中最常用的客户端API。 而LowLevel API则需要客户端自己管理Kafka的运行细节&#xff0c;Partition&#x…