java参数校验

2023-12-20 07:07:02

引入依赖

 <!--参数效验-->
        <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;
    }

}

文章来源:https://blog.csdn.net/weixin_45086164/article/details/135076050
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。