当前位置: 首页 > news >正文

SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo

ErrorEnum.java // 枚举所有的错误

package com.example.demo.enums;import lombok.Getter;public enum ErrorEnum {SYSTEM_ERROR(-1, "系统错误"),PARAM_ERROR(-2, "参数错误"),OK(0, "成功"),;@Getterprivate final int code;@Getterprivate final String errorMsg;ErrorEnum(int code, String errorMsg) {this.code = code;this.errorMsg = errorMsg;}
}

LogicException.java // 逻辑异常封装

package com.example.demo.core;import com.example.demo.enums.ErrorEnum;
import lombok.Getter;public class LogicException extends RuntimeException {@Getterprivate final ErrorEnum errorEnum;public LogicException(ErrorEnum errorEnum) {super(String.format("errorCode=%d,errorMsg=%s", errorEnum.getCode(), errorEnum.getErrorMsg()));this.errorEnum = errorEnum;}
}

ResponseEntity.java // 返回值封装

package com.example.demo.core;import com.example.demo.enums.ErrorEnum;
import lombok.AllArgsConstructor;
import lombok.Data;@AllArgsConstructor
@Data  // 注意这个!!!
public class ResponseEntity<T> {private final int code;private final T data;private final String errorMsg;public static <T> ResponseEntity<T> success(T data) {return new ResponseEntity<>(ErrorEnum.OK.getCode(), data, ErrorEnum.OK.getErrorMsg());}public static ResponseEntity<Void> exception(ErrorEnum errorEnum) {return new ResponseEntity<>(errorEnum.getCode(), null, errorEnum.getErrorMsg());}
}

IReuqest.java // 用于检查接口

package com.example.demo.core;public interface IRequest {/*** 进行参数错误检检查*/void checkParamError();
}

GlobalExceptionCatch.java // 全局异常捕获

package com.example.demo.core;import com.example.demo.enums.ErrorEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j
@RestControllerAdvice
public class GlobalExceptionCatch {@ExceptionHandler(Throwable.class)public ResponseEntity<Void> exceptionHandler(Throwable e) {log.error("globalException=", e);// 默认是系统错误ErrorEnum errorEnum = ErrorEnum.SYSTEM_ERROR;// 逻辑错误if (e instanceof LogicException) {LogicException logicException = (LogicException) e;errorEnum = logicException.getErrorEnum();}return ResponseEntity.exception(errorEnum);}
}

AccountController.java

package com.example.demo.controller;import com.example.demo.core.LogicException;
import com.example.demo.core.ResponseEntity;
import com.example.demo.msg.RegisterRequest;
import com.example.demo.msg.RegisterResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/account")
public class AccountController {/*** 情况1:* http://localhost:8080/account/register?username="xx"&password="123"* 返回:* {"code":0,"data":{"username":"a1","password":"1231"},"errorMsg":"成功"}* 情况2:* http://localhost:8080/account/register* 返回:{"code":-2,"data":null,"errorMsg":"参数错误"}* 同时打印了错误** @param request* @return*/@RequestMapping("/register")public ResponseEntity<RegisterResponse> register(RegisterRequest request) throws LogicException {request.checkParamError();// 返回RegisterResponse response = new RegisterResponse();response.setUsername(request.getUsername());response.setPassword(request.getPassword());return ResponseEntity.success(response);}
}

RegisterRequest.java

package com.example.demo.msg;import com.example.demo.core.IRequest;
import com.example.demo.enums.ErrorEnum;
import com.example.demo.core.LogicException;
import lombok.Data;
import org.springframework.util.StringUtils;@Data
public class RegisterRequest implements IRequest {private String username;private String password;@Overridepublic void checkParamError() {if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {throw new LogicException(ErrorEnum.PARAM_ERROR);}}
}

RegisterResponse.java

package com.example.demo.msg;import lombok.Data;@Data
public class RegisterResponse {private String username;private String password;
}

相关文章:

SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo

ErrorEnum.java // 枚举所有的错误 package com.example.demo.enums;import lombok.Getter;public enum ErrorEnum {SYSTEM_ERROR(-1, "系统错误"),PARAM_ERROR(-2, "参数错误"),OK(0, "成功"),;Getterprivate final int code;Getterprivate fi…...

7机器人位姿的数学描述与坐标变

由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为&#xff1a; 式中为三个单位正交主矢量&#xff0c;分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位&#xff0c;∠XBXA表…...

基于ESP8266 开发板(MCU)遥控小车

遥控小车 ​ 遥控界面 ​ 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…...

【C生万物】C语言数据类型、变量和运算符

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…...

CTF--Web安全--SQL注入之‘绕过方法’

一、什么是绕过注入 众所周知&#xff0c;SQL注入是利用源码中的漏洞进行注入的&#xff0c;但是有攻击手段&#xff0c;就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令&#xff0c;符号&#xff0c;甚至空格&#xff0c;会在反SQL机制中…...

线程池常用的阻塞队列

新任务来的时候&#xff0c;会先判断当前运行的线程数量是否达到核心线程数&#xff0c;如果达到的话&#xff0c;新任务就会被存放在队列中。 不同的线程池会选用不同的阻塞队列&#xff0c;我们可以结合内置线程池来分析。 ● 容量为 Integer.MAX_VALUE 的 LinkedBlockingQue…...

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…...

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…...

SpringMVC-组件解析

一、引子 我们在上一篇文章Spring MVC-基本概念中&#xff0c;为读者解释了如何使用SpringMVC框架&#xff0c;将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇&#xff0c;SpringMVC框架到底做了什么&#xff0c;是怎么把请求分发给…...

ubuntu22.04@laptop OpenCV Get Started: 002_reading_writing_videos

ubuntu22.04laptop OpenCV Get Started: 002_reading_writing_videos 1. 源由2. Read/Display/Write应用Demo3 video_read_from_file3.1 C应用Demo3.2 Python应用Demo3.3 重点过程分析3.3.1 读取视频文件3.3.2 读取文件信息3.3.3 帧读取&显示 4 video_read_from_image_sequ…...

Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作

上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…...

Chrome扩展开发纪要

1. 开发人员模式 以Edge(Chromium)为例, 可在管理扩展页, 在左侧开发人员模式打开, 只有此项开启后才能加载未压缩的扩展, 虽然也可以打包扩展, 但是浏览器会检测, 未上线的crx包是无法被安装的. 所以不打算上架的crx只能使用 加载解压缩的扩展 安装 2. 创建扩展 2.1 建立文…...

LeetCode-第28题-找出字符串中第一个匹配项的下标

1.题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …...

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…...

【原创 附源码】Flutter海外登录--Tiktok登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月7日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…...

国内chatGPT3.5升级到chatGPT4.0的教程(24年2月更新)

最新的充值方法看这里。 通过虚拟卡 WildCard 的方式来升级 GPT 4.0 最快了&#xff0c;大概2分钟就可以升级完成, 而且升级 GPT 4.0 价钱也不贵&#xff0c;虚拟卡一年10美元&#xff0c;GPT4 每个月也才 20美元。如果你觉得 GPT 4.0 对你可能有帮助&#xff0c;那就赶快来升级…...

【python量化交易】qteasy使用教程01 - 安装方法及初始化配置

qteasy教程1 - 安装方法及初始化配置 qteasy教程1 - 安装方法及初始配置qteasy安装前的准备工作1&#xff0c; 创建安装环境2&#xff0c;安装MySQL数据库 (可选)安装pymysql 3&#xff0c;创建tushare账号并获取API token (可选)4&#xff0c;安装TA-lib (可选)WindowsMac OSL…...

UML 2.5图形库

UML 2.5图形库 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#…...

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目PostgresSQL数据库版)

1首先介绍下若依项目&#xff1a; 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案&#xff0c;包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…...

打卡今天学习 Linux

过年了&#xff0c;祝大家过年快乐 在今天的学习中&#xff0c;我们涉及了一些关键的 Linux 系统管理知识点&#xff0c;包括 systemctl、IP 地址配置、域名解析、映射的创建、软链接等。让我们简要回顾一下这些主题。 1. systemctl systemctl 是一个强大的 Linux 系统管理工…...

Gentoo Linux 中通过 Overlay 优雅安装 Cursor 二进制编辑器

1. 项目概述与背景如果你是一名 Gentoo Linux 的用户&#xff0c;同时又对 Cursor 这款新兴的 AI 代码编辑器感兴趣&#xff0c;那么你很可能已经遇到了一个经典的 Gentoo 式难题&#xff1a;如何在这样一个以源码编译为核心的发行版上&#xff0c;方便地安装一个官方只提供.de…...

OpenClaw-Readwise:开源高亮同步工具的设计与实现

1. 项目概述&#xff1a;一个连接知识碎片的“机械爪” 如果你和我一样&#xff0c;是个重度阅读爱好者&#xff0c;并且习惯把在各种地方&#xff08;比如Kindle、网页文章、PDF文档&#xff09;看到的好句子、有启发的段落&#xff0c;用高亮&#xff08;Highlight&#xff…...

AI 术语通俗词典:贝叶斯估计

贝叶斯估计是统计学、机器学习、概率推断和人工智能中非常重要的一个术语。它用来描述一种在已有认识的基础上&#xff0c;根据新数据更新参数判断的方法。换句话说&#xff0c;贝叶斯估计是在回答&#xff1a;我们原来对参数有一个初步判断&#xff0c;现在看到了一批数据&…...

Docker镜像标准化机器人开发环境:OpenClaw项目协作实践

1. 项目概述&#xff1a;一个面向协作开发的OpenClaw项目镜像最近在开源社区里&#xff0c;一个名为laolin5564/openclaw-collab-dev的Docker镜像引起了我的注意。这个镜像的名字本身就很有意思&#xff0c;它明确指向了“OpenClaw”和“协作开发”这两个核心概念。对于从事机器…...

GPU流水线设计:提升深度学习计算效率的关键技术

1. GPU流水线设计基础概念现代GPU架构为深度学习工作负载提供了强大的并行计算能力&#xff0c;但传统的批量同步并行(BSP)执行模型存在资源利用率低下的问题。GPU流水线技术通过将计算图分解为多个阶段并在其间插入队列节点&#xff0c;实现了计算与通信的重叠执行。1.1 传统B…...

Windows系统优化神器:3步解决C盘爆红和电脑卡顿难题

Windows系统优化神器&#xff1a;3步解决C盘爆红和电脑卡顿难题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾经遇到过Windows电脑C盘空间不足的困扰&a…...

PortAudio性能测试与调优:如何实现最低延迟音频处理的完整指南

PortAudio性能测试与调优&#xff1a;如何实现最低延迟音频处理的完整指南 【免费下载链接】portaudio PortAudio is a cross-platform, open-source C language library for real-time audio input and output. 项目地址: https://gitcode.com/gh_mirrors/po/portaudio …...

从高通市值超越英特尔看半导体IP价值与Fabless模式

1. 从一则旧闻谈起&#xff1a;当高通市值超越英特尔2012年11月9日&#xff0c;对于全球半导体行业而言&#xff0c;是一个值得被记住的日子。那天&#xff0c;一则消息在业界引发了不小的震动&#xff1a;高通&#xff08;Qualcomm&#xff09;的市值首次超越了英特尔&#xf…...

FastAPI部署演进:从Gunicorn+Uvicorn镜像到原生多进程的迁移指南

1. 项目背景与演进&#xff1a;从“黄金搭档”到“历史遗产”如果你在过去几年里用 FastAPI 部署过 Web 服务&#xff0c;大概率听说过或者用过tiangolo/uvicorn-gunicorn-fastapi-docker这个 Docker 镜像。它一度是 FastAPI 官方文档里推荐的部署方案之一&#xff0c;由 FastA…...

自然语言脚本编程:用humanscript实现意图驱动的自动化

1. 项目概述&#xff1a;当代码遇上自然语言最近在折腾一些自动化脚本时&#xff0c;我总在想&#xff0c;有没有一种方式&#xff0c;能让写脚本这件事变得像写待办事项清单一样简单&#xff1f;比如&#xff0c;我想让电脑“把今天下载的图片都压缩一下&#xff0c;然后传到网…...