springboot:统一参数校验(JSR303校验)

news/2024/11/17 16:04:23/

        业务需求:在controller中对必填参数和参数类型做合法性校验

1、在项目父工程添加spring-boot-starter-validation的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、在引入的validation依赖包下有很多这样的校验注解,直接使用注解定义校验规则即可。

3、现在对下面业务中的文章发布功能做参数校验

package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.wemedia.model.po.WmNewsMaterial;
import com.heima.wemedia.service.WmNewsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController {@AutowiredWmNewsService wmNewsService;/*文章发布*/@PostMapping("/submit")public ResponseResult addNews(@RequestBody WmNewsDto dto){return wmNewsService.addNews(dto);}}

4、可以看到上面接口使用WmNewsDto模型对象接收参数,所以进入WmNewsDto类,在属性上添加校验规则。

        下面我使用了NotEmpty注解验证非空

package com.heima.model.common.wemedia.model.dto;import lombok.Data;import javax.validation.constraints.NotEmpty;
import java.util.Date;
import java.util.List;@Data
public class WmNewsDto {private Integer id;/*** 标题*/@NotEmpty(message = "文章标题不能为空")private String title;/*** 频道id*/private Integer channelId;/*** 标签*/@NotEmpty(message = "标签不能为空")private String labels;/*** 发布时间*/private Date publishTime;/*** 文章内容*/@NotEmpty(message = "文章内容不能为空")private String content;/*** 文章封面类型  0 无图 1 单图 3 多图 -1 自动*/private Short type;/*** 提交时间*/private Date submitedTime; /*** 状态 提交为1  草稿为0*/private Short status;/*** 封面图片列表 多张图以逗号隔开*/private List<String> images;
}

5、还需要再controller中添加@Validated 注解开启参数校验

    /*文章发布*/@PostMapping("/submit")public ResponseResult addNews(@RequestBody @Validated WmNewsDto dto){return wmNewsService.addNews(dto);}

6、如果校验出错Spring会抛出MethodArgumentNotValidException异常,我们需要在统一异常处理器中捕获异常,解析出异常信息。

        代码如下

@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse methodArgumentNotValidException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();List<String> msgList = new ArrayList<>();//将错误信息放在msgListbindingResult.getFieldErrors().stream().forEach(item->msgList.add(item.getDefaultMessage()));//拼接错误信息String msg = StringUtils.join(msgList, ",");log.error("【系统异常】{}",msg);return new RestErrorResponse(msg);
}


http://www.ppmy.cn/news/1018073.html

相关文章

来讲一讲面试必问的异步FIFO设计!

异步FIFO设计可以说是数字IC设计工程师面试时必问的一个问题了&#xff0c;也是我们经常使用但是又往往被忽略的一个东西&#xff0c;今天就展开详细说一说不同深度&#xff08;2^N或者非2^N&#xff09;异步FIFO的设计思想&#xff1b; 一&#xff1a;2^N深度异步FIFO设计 1…

【源码编译并安装RocketMQ Dashboard】

【源码编译并安装RocketMQ Dashboard】 一、环境说明二、源码编译并执行三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8已经安装了RocketMQ-5.1.3 单Master集群&#xff0c;且使用Local模式部署&#xff0c;即Broker和Proxy同进程部署…

【题解】寻找峰值

题目链接&#xff1a;寻找峰值 解题思路1&#xff1a;二分法 首先题目保证了i-1和in时值都为负无穷&#xff0c;所以上坡一定有波峰&#xff0c;下坡不一定有波峰 代码如下&#xff1a; int findPeakElement(vector<int>& nums) {int left 0;int right nums.siz…

信道复用技术

信道划分介质访问控制将使用介质的每个设备与来自同一通信信道上的其他设备的通信隔离开来&#xff0c;把时域和频域资源合理地分配给网络上的设备 多路复用&#xff1a;就是将多个信号组合在一条物理信道上进行传输&#xff0c;使多个计算机或终端设备共享信道资源&#xff0c…

LeetCode_动态规划_中等_1749.任意子数组和的绝对值的最大值

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个整数数组 nums 。一个子数组 [numsl, numsl1, …, numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 … numsr-1 numsr) 。请你找出 nums 中和的绝对值 最大的任意子数组&#xff08;可能为空…

分辨率 and 媒体查询 - 1

电脑设置那里的 “1920 * 1080” 表示分辨率的宽、高 “1920” 是宽度&#xff0c;表示屏幕或显示器的水平像素数量&#xff0c; “1080” 是高度&#xff0c;表示屏幕或显示器的垂直像素数量 通常&#xff0c;分辨率以宽度 x 高度的形式表示&#xff0c;宽度在前&#xff0c…

Rocketmq 5.0 任意时间定时消息(RIP-43) 原理详解 源码解析

1. 背景 1.1 概念和应用场景 延迟消息&#xff08;定时消息&#xff09;即消息到达消息队列服务端后不会马上投递&#xff0c;而是到达某个时间才投递给消费者。它在在当前的互联网环境中有非常大的需求。 例如电商/网约车等业务中都会出现的订单场景&#xff0c;客户下单后…

【Express.js】集成SocketIO

集成SocketIO 本节我们介绍在如何在 express 中集成 Socket.IO Socket.IO 算是 WebSocket 的一个超集&#xff0c;进行了一些封装和拓展。 准备工作 创建一个 express.js 项目&#xff08;本文基于evp-express-cli&#xff09;安装socket.io.js: npm i socket.io创建代理 …