java参数校验

news2024/9/28 11:23:07

引入依赖

 <!--参数效验-->
        <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.coloradmin.cn/o/1323481.html

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

相关文章

Golang(壹)

爱情不需要华丽的言语&#xff0c;只需要默默的行动。 简介 应用领域&#xff1a; 下载vscode 使用vscode Go下载 - Go语言中文网 - Golang中文社区 下载sdk 解压到文件中&#xff0c;打开sdk解压文件 穿插dos操作系统知识点&#xff1a; 测试go语言环境 看到vscode 的目录结…

[Win10系统] Win10 任务栏软件图标显示为空白 | 解决方案

文章目录 [Win10系统] Win10 任务栏软件图标显示为空白 | 解决方案前言产生错误的原因解决方案方法一&#xff1a;手动操作方法二&#xff1a;自动操作 总结 [Win10系统] Win10 任务栏软件图标显示为空白 | 解决方案 前言 有时候&#xff0c;我们在使用 Windows 10 系统时&…

深度学习环境配置------windows系统(GPU)------Pytorch

深度学习环境配置------windows系统&#xff08;GPU&#xff09;------Pytorch 准备工作明确操作系统明确显卡系列 CUDA和Cudnn下载与安装1.下载2.安装 环境配置过程1.安装Anacoda2.配置环境1&#xff09;创建一个新的虚拟环境2&#xff09;pytorch相关库的安装 2.安装VScode1&…

图片去除背景,无水印下载的六大免费平台!

随着人工智能技术的不断进步&#xff0c;越来越多的应用场景开始利用人工智能技术来提升用户体验。其中&#xff0c;AI去除图片背景是一项非常实用的功能。AIGCer尝试了多个平台&#xff0c;排除了很多有水印&#xff0c;需要付费&#xff0c;去除效果差等平台&#xff0c;为大…

[Verilog] 设计方法和设计流程

主页&#xff1a; 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法&#xff08;top-down&#xff09;。设计流程是指从一个项目开始从项目需求分析&#xff0c;架构设计&#xff0c;功能验证&#…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频&#xff1a; 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图&#xff0c;而 .* 就表示贪婪匹配&#xff0c;即尽可能多的匹配到符合的字符串&#xff0c;如果使用贪婪匹配&#xff0c;那么结果就是图中的情况三 p…

vue-springboot+java导师选择分配双选管理系统 0spy6

.2.3功能需求 本导师选择管理系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了学生、导师和管理员这三者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&…

凤凰架构之事务处理

目录 本地事务全局事务共享事务分布式事务可靠消息队列TCC事务SAGA事务 本地事务 本地事务是最基础的一种事务解决方案&#xff0c;只适用于单个服务使用单个数据源的场景。从应用角度看&#xff0c;它是直接依赖于数据源本身提供的事务能力来工作的&#xff0c;在程序代码层面…

石器时代H5小游戏架设教程

本文讲解石器时代 H5 之恐龙宝贝架设教程&#xff0c;想研究 H5 游戏如何实现&#xff0c;那请跟着此次教程学习在拥有小游戏源码的情况下该如何搭建起来 开始架设 1. 架设条件 石器时代架设需要准备&#xff1a; 一台linux 服务器&#xff0c;建议 CentOs 7.6 版本&#xf…

2023 英特尔On技术创新大会直播 |AI科技创新的引路者

英特尔大会 前言英特尔人工智能英特尔创新技术基于英特尔架构的科学计算总结 前言 英特尔技术创新大会是一个令人激动和启发的盛会。在这次大会上&#xff0c;我有幸观看了许多令人瞩目的科技创新和前沿技术的展示。这些展示不仅展示了英特尔作为科技巨头的实力&#xff0c;更…

告诉你playwright 不使用with sync_playwright() as编写脚本的新方法

大家都知道playwright代码的标准写法是&#xff1a; with sync_playwright() as p:browser p.chromium.launch(channel"chrome", headlessFalse)page browser.new_page()page.goto("http://www.baidu.com")print(page.title())browser.close() with sy…

Vue - 组件注册及其原理

1 Vue组件注册 Vue中注册组件的方式有两种&#xff1a;全局注册和局部注册。 2 局部注册 import HelloWorld from xxx/xxx export default {components: {HelloWorld} }3 全局注册 3.1 全局组件挂载 示例一&#xff1a; /** src/main.js */ // 表格动态列组件 import Dyn…

mysql 22day 对表格的增删改查、对数据的增删改查、对内容进行操作

目录 mysql 配置文件授权 远程链接 &#xff08;grant&#xff09;数据库操作创建库&#xff08;create&#xff09;切换数据库&#xff08;use&#xff09;查看当前所在库 表操作创建一张员工表查看表结构修改表名称增加字段修改字段名&#xff08;ALTER &#xff09;修改字段…

Floyd求最短路(Floyd算法)

参考&#xff1a;约会怎么走到目的地最近呢&#xff1f;一文讲清所有最短路算法问题-CSDN博客 有4个城市8条路&#xff0c;公路上的数字表示这条公路的长短&#xff0c;并且路是单向的&#xff0c;现在要求我们求出任意两个城市之间的最短路程&#xff0c;也就是求任意两个点之…

MIT18.06线性代数 笔记1

文章目录 方程组的几何解释矩阵消元乘法和逆矩阵A的LU分解转置-置换-向量空间R列空间和零空间求解Ax0主变量 特解求解Axb可解性和解的结构线性相关性、基、维数四个基本子空间矩阵空间、秩1矩阵和小世界图图和网络复习一 方程组的几何解释 线性组合&#xff1a; 找到合适的x和…

GitHub 如何修改 Fork from

如果你的仓库上面是 Fork from 的话&#xff0c;我们有什么办法能够取消掉这个 Fork from&#xff1f; 解决办法 GitHub 上面没有让你取消掉 Fork 的办法。 如果进入设置&#xff0c;在可见设置中也没有办法修改仓库的可见设置选项。 唯一的解决办法就是对你需要修改的仓库先…

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

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

蓝牙键盘怎么连接电脑?正确操作步骤分享!

“由于我经常需要用到电脑&#xff0c;为了方便&#xff0c;我新买了一个蓝牙键盘&#xff0c;但是我不知道应该如何把这个蓝牙键盘连接上电脑&#xff0c;有没有朋友可以分享方法呀&#xff1f;” 在数字化时代&#xff0c;蓝牙设备已经成为了我们生活中不可或缺的一部分。其中…

spark介绍及简单使用

简介 Spark是由加州大学伯克利分校AMPLab&#xff08;AMP实验室&#xff09;开发的开源大数据处理框架。起初&#xff0c;Hadoop MapReduce是大数据处理的主流框架&#xff0c;但其存在一些限制&#xff0c;如不适合迭代算法、高延迟等。为了解决这些问题&#xff0c;Spark在20…

Hutool--DFA 敏感词工具类

使用hutool的dfa工具类可以很好的帮助我们来实现敏感词过滤的功能&#xff0c;下面从用例入手来逐步地去j简单了解一下dfa工具类。 字典树 DFA算法的核心是建立了以敏感词为基础的许多敏感词树&#xff08;字典树&#xff09;。 它的基本思想是基于状态转移来检索敏感词。 字…