1、统一数据返回

使用逆向工程来进行测试,实体,mapper等省略;

1.1 直接使用 RequestResoult

1.1.1 RequestResoult 请求结果返回实体

//统一返回 实体 类
@Data
public class RequestResult<T> { //状态码
private String code; //状态说明,对code的说明
private String msg; //接口数据
private T data; }

1.1.2 service层

1.1.2.1 接口
public interface EdocEntryService {

    //按摘要查询
List<EdocEntry> getEdocEntriesBySummary(String summary); }
1.1.2.2 实现类

注意记得在 主启动类中添加 mapper接口扫描注解 :@MapperScan("com.kgc.sbt.mapper")

@Service
public class EdocEntryServiceImpl implements EdocEntryService { @Autowired(required = false)
private EdocEntryMapper edocEntryMapper; @Override
public List<EdocEntry> getEdocEntriesBySummary(String summary) { //使用逆向工程,封装查询条件 EdocEntryExample edocEntryExample = new EdocEntryExample(); //排序条件
edocEntryExample.setOrderByClause(" id desc "); //根据摘要 模糊查询
edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%"); //调用持久层 查询数据
return edocEntryMapper.selectByExample(edocEntryExample); } }

1.1.3 测试请求

@Slf4j
@RestController
public class EdocEntryController { @Autowired
private EdocEntryService edocEntrieService; //根据电子文档,查询文档列表,直接使用 RequestResult
@GetMapping("/edocEntries")
//指定请求返回类型 RequestResult<List<EdocEntry>>
//public RequestResult<List<EdocEntry>> edocEntries(@RequestParam(required = false) String summary){
//自适应请求返回类型 RequestResult<?>
public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){ //调用业务接口,获取文档列表,进行统一返回
//创建统一返回对象
//每次都需要创建返回对象,代码冗余,不利于维护
RequestResult<List<EdocEntry>> requestResult = new RequestResult<>();
requestResult.setCode("200");
requestResult.setMsg("success");
List<EdocEntry> edocEntriesBySummary = edocEntrieService.getEdocEntriesBySummary(summary);
log.info("{}",edocEntriesBySummary);
requestResult.setData(edocEntriesBySummary);
//接口统一返回查询结果
return requestResult; } }

测试结果:

1.2 使用 ResultBuildUtil 结果对象构建工具

1.2.1 CommonConstant 常量类

//Description: 系统常量类,统一管理项目中所有的常量
public class CommonConstant { /*
统一返回成功的状态码
*/
public static final String UNIFY_RESULT_SUCCESS_CODE = "200"; /*
统一返回成功的信息
*/
public static final String UNIFY_RESULT_SUCCESS_MSG = "SUCCESS"; /*
统一返回错误的状态码
*/
public static final String UNIFY_RESULT_FAIL_CODE = "999"; /*
统一返回错误的信息
*/
public static final String UNIFY_RESULT_FAIL_MSG = "FAIL"; /*
分页默认页吗
*/
public static final int DEFAULT_INIT_PAGE_NO = 1; /*
分页默认条数
*/
public static final int DEFAULT_INIT_PAGE_SIZE = 3; }

1.2.2 ResultBuildUtil结果对象构建工具列

//Description: 结果构建工具类
public class ResultBuildUtil { //构建成功返回,支持任意类型参数
public static <T> RequestResult<T> success(T t) {
//创建统一返回成功结果对象
RequestResult<T> requestResult = new RequestResult<>(); requestResult.setCode(CommonConstant.UNIFY_RESULT_SUCCESS_CODE);
requestResult.setMsg(CommonConstant.UNIFY_RESULT_SUCCESS_MSG);
requestResult.setData(t); return requestResult; } //构建成功返回,空参
public static <T> RequestResult<T> success() {
return success(null);
} //构建 失败返回,支持任意类型参数,用户不便于归类的异常错误结果返回
public static <T> RequestResult<T> fail(T t) {
//创建统一返回失败结果对象
RequestResult<T> requestResult = new RequestResult<>(); requestResult.setCode(CommonConstant.UNIFY_RESULT_FAIL_CODE);
requestResult.setMsg(CommonConstant.UNIFY_RESULT_FAIL_MSG);
requestResult.setData(t); return requestResult; } //构建 失败返回,空参
public static <T> RequestResult<T> fail() {
//创建统一返回失败结果对象
return fail(null); } //构建 失败返回,自定义错误码,和说明,支持任意类型参数
public static <T> RequestResult<T> fail(String errCode,String errMsg,T t) {
//创建统一返回失败结果对象
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(errCode);
requestResult.setMsg(errMsg);
requestResult.setData(t);
return requestResult;
} //构建 失败返回,自定义错误码,和说明,无参
public static <T> RequestResult<T> fail(String errCode,String errMsg) {
//创建统一返回 失败结果对象
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(errCode);
requestResult.setMsg(errMsg);
return requestResult;
} }

1.2.3 service层

service层不变;

1.2.4 请求测试

@Slf4j
@RestController
public class EdocEntryController { @Autowired
private EdocEntryService edocEntrieService; //根据电子文档,查询文档列表, 使用结果构建工具
@GetMapping("/edocEntries")
public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){ //使用结果构建工具,返回成功的结果
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary)); } }

测试结果:

2、统一分页工具

2.1 PageSupport 统一分页工具类

// 分页 结果返回类
@Data
public class PageSupport<T> { //当前页码
private int pageNo; //页面条数
private int pageSize; //总条数
private int totalCount; //总页数
private int totalPage; //分页数据
private Collection<T> PageData; //当总条数确定时,总条数确定
public void setTotalCount(int totalCount) {
this.totalCount = totalCount; totalPage = totalCount % this.pageSize == 0
? totalCount / this.pageSize
: totalCount / this.pageSize + 1; } }

2.2 service 层

2.2.1 接口

public interface EdocEntryService {

    //条件分页查询
PageSupport<EdocEntry> getEdocEntriesBySummary(String summary,Integer pageNo,Integer pageSize); }

2.2.2 实现类

@Service
public class EdocEntryServiceImpl implements EdocEntryService { @Override
public PageSupport<EdocEntry> getEdocEntriesBySummary(String summary, Integer pageNo, Integer pageSize) { //创建统一返回分页对象
PageSupport<EdocEntry> pageSupport = new PageSupport<>(); //设置分页参数
pageSupport.setPageNo(pageNo < 1 ? CommonConstant.DEFAULT_INIT_PAGE_NO : pageNo);
pageSupport.setPageSize(pageNo < 3 ? CommonConstant.DEFAULT_INIT_PAGE_SIZE : pageSize); //封装查询条件
EdocEntryExample edocEntryExample = new EdocEntryExample(); //排序条件
edocEntryExample.setOrderByClause(" id desc "); //根据摘要 模糊查询
edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%"); // 查询满足条件总条数
pageSupport.setTotalCount((int) edocEntryMapper.countByExample(edocEntryExample)); //增加分页参数
edocEntryExample.setOffset((long)(pageSupport.getPageNo()-1)*pageSupport.getPageSize());
edocEntryExample.setLimit(pageSupport.getPageSize()); //增加分页数据
pageSupport.setPageData(edocEntryMapper.selectByExample(edocEntryExample)); //返回分页对象
return pageSupport;
} }

2.3 commons-lang中 isEmpty 方法和idBlank区别

2.3.1 依赖

<!-- commons-lang start -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- commons-lang end -->

2.3.2 isEmpty 方法和idBlank区别

isEmpty 和 isBlank ,isEmpty 方法和idBlank区别:只包含空格字符串判断,isEmpty是false,isBlank是true;
2.3.2.1 isEmpty
* <pre>
* StringUtils.isEmpty(null) = true
* StringUtils.isEmpty("") = true
* StringUtils.isEmpty(" ") = false
* StringUtils.isEmpty("bob") = false
* StringUtils.isEmpty(" bob ") = false
* </pre>
2.3.2.2 isBlank
* <pre>
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* </pre>

2.4 测试请求

//根据电子文档,查询文档列表
@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "summary",required = false) String summary,
@RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize){ if(StringUtils.isBlank(summary)){
return ResultBuildUtil.fail();
} //调用业务接口,获取文档列表,进行统一返回
//使用结果构建工具,返回成功的结果
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize)); }

测试结果:

2.5 commons-lang3 生成6位随机数

2.5.1 依赖

<!-- commons-lang3 start -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- commons-lang3 end -->

2.5.2 代码

String code = RandomStringUtils.randomNumeric(6);

2.6 Pattern.matches()正则匹配

import java.util.regex.Pattern;

//举例:
if(!Pattern.matches("1[3,5,7,8,9]\\d{9}",userTel)){
//不匹配的情况
log.warn("****** 手机号:{},格式非法 ******",userTel);
}

3、统一异常处理

3.1 EdocExceptionEnum 自定义异常枚举

//自定义异常枚举
public enum EdocExceptionEnum { /**
* 参数为空
*/
EDOC_REQUEST_PARAM_EMPTY("201", "参数为空"), /**
* 参数为非法
*/
EDOC_REQUEST_PARAM_ILLEGAL("202", "参数非法"), /**
* 网络异常
*/
EDOC_NETWORK_ERROR("301", "网络异常"), /**
* 数据库异常
*/
EDOC_DATABASE_ERROR("401", "数据库异常"), /**
* 数据库异常
*/
EDOC_SYSTEM_ERROR("501", "系统异常"); /**
* 异常码
*/
private String errCode; /**
* 异常说明
*/
private String errMsg; /**
* 提供带有两个参数的构造方法
*/
EdocExceptionEnum(String errCode, String errMsg){
this.errCode = errCode;
this.errMsg = errMsg;
} public String getErrCode() {
return errCode;
} public String getErrMsg() {
return errMsg;
} }

3.2 EdocException 自定义异常类

public class EdocException extends RuntimeException{

    /*
异常枚举类型全局私有属性
*/
private EdocExceptionEnum edocExceptionEnum; //继承 RuntimeException 生成所有的构造方法
public EdocException() {
} public EdocException(String message) {
super(message);
} public EdocException(String message, Throwable cause) {
super(message, cause);
} public EdocException(Throwable cause) {
super(cause);
} public EdocException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
} //自定义枚举异常构造函数
public EdocException(EdocExceptionEnum edocExceptionEnum){
this.edocExceptionEnum = edocExceptionEnum;
} //获取枚举异常属性
public EdocExceptionEnum getEdocExceptionEnum() {
return edocExceptionEnum;
}
}

3.3 EdocExceptionHandler 自定义异常统一处理类

//自定义异常统一处理类
@ControllerAdvice
public class EdocExceptionHandler { /**
* @author : huayu
* @date : 19/10/2022
* @param : [edocException]
* @return : requestResoult<?>
* @description : 系统自定义异常处理,对系统中所有抛出自定义的异常,都会进行统一拦截处理,实现统一返回
*/
@ExceptionHandler(EdocException.class) //指定对该自定义异常类 进行处理
@ResponseBody //指定返回的数据 为 json类型
public RequestResult<?> handleEdocException(EdocException edocException){
//统一返回失败的结果(前提:抛出的必须是带枚举类型的异常)
return ResultBuildUtil.fail(edocException.getEdocExceptionEnum().getErrCode(),edocException.getEdocExceptionEnum().getErrMsg()); } }

3.4 请求测试

@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "summary",required = false) String summary,
@RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize){ //判断 summary参数是否为空
if(StringUtils.isBlank(summary)){
//抛出自定义异常:使用异常枚举
throw new EdocException(EdocExceptionEnum.EDOC_REQUEST_PARAM_EMPTY);
} ////抛出自定义异常:使用异常枚举
try {
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize));
} catch (Exception e) {
//e.printStackTrace();
//抛出自定义异常:使用异常枚举
throw new EdocException(EdocExceptionEnum.EDOC_DATABASE_ERROR);
} }

测试请求参数为空:

测试数据库密码错误:

SpringBoot(八) - 统一数据返回,统一分页工具,统一异常处理 (生成随机数,正则校验)的更多相关文章

  1. JAVA工具类--手机号生成与正则校验

    package utils; import java.util.Random; import java.util.regex.Pattern; /** * Created with IntelliJ ...

  2. JAVA函数的返回值类型详解以及生成随机数的例题

    函数的四要素:函数名.输入.输出(返回).加工. 函数分为两种:一种是有返回值得函数,一种是没有返回值的函数. 1. 定义:没有返回值的函数:(当我不需要函数的计算结果再拿出来进行运算的时候,我就不需 ...

  3. Js处理数据——前端分页工具

    这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页--每次根据页码.页大小 ...

  4. SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

    SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...

  5. SpringBoot统一处理返回结果和异常情况

    如果文章有帮助到你,还请点个赞或留下评论 原因 在springboot项目里我们希望接口返回的数据包含至少三个属性: code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功. messa ...

  6. springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...

  7. SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!

    大家好,我是飘渺. 今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常. 首先我们来看看为什么要返回统一的标准格式? 为什么要对Sp ...

  8. 基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式

    前言 开发接口,是给客户端(Web前端.App)用的,前面说的RESTFul,是接口的规范,有了统一的接口风格,客户端开发人员在访问后端功能的时候能更快找到需要的接口,能写出可维护性更高的代码. 而接 ...

  9. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  10. 统一返回对象封装和统一异常捕获封装springboot starter

    好久没有更新文章了,高龄开发没什么技术,去了外包公司后没怎么更新文章了.今天分享下统一处理starter,相信开发web系统的时候都是会涉及到前后端的交互,而后端返回数据的时候一般都会统一封装一个返回 ...

随机推荐

  1. Python获取jenkins job信息

    pip install Python-jenkins  如果只是想获取到jenkins的全局变量(比如job url),使用jenkins全局变量就能做到. https://www.jb51.net/ ...

  2. DB GPT本地安装部署

    源码下载 git clone https://github.com/eosphoros-ai/DB-GPT.git Miniconda环境安装 Miniconda 安装 mkdir -p ~/mini ...

  3. 使用wxpython开发跨平台桌面应用,基类列表窗体的抽象封装处理

    在开发一套系统框架的时候,除了关注实现系统的功能实现外,我们对于系统的各个方面都是应该精益求精,以最少的编码做最好的事情,在开发的各个层次上,包括前端后端,界面处理.后端处理.常用辅助类.控件封装等等 ...

  4. springboot将文件处理成压缩文件

    前言 在工作我们经常会出现有多个文件,为了节省资源会将多个文件放在一起进行压缩处理:为了让大家进一步了解我先将springboot处理的方法总结如下,有不到之处敬请大家批评指正! 一.文件准备: ht ...

  5. 低功耗4G模组Air780E快速入门:固件的远程升级

    ​ 今天我们学习Air780E快速入门之固件的远程升级,小伙伴们,学起来吧! 一.生成差分包 合宙的远程升级支持使用合宙云平台和自建服务器,此例程使用的是合宙云平台. 1.1 准备新旧版的core和脚 ...

  6. php 读取 csv 转数组列表

    我们有个文档需要修改,但是文档列太多,以及数量太大,以至于眼睛看起来很吃力,于是我决定做个简单的转化用脚本读取我想要验证的列的内容是否正确. 于是就产生了一个这样将csv快速的转为数组列表的功能函数 ...

  7. WordCloudStudio 支持支付宝周期性订阅

    我们很高兴地宣布,WordCloudStudio 现已支持通过支付宝 (AliPay) 的周期性订阅支付功能!无论您是需要制作精美的词云图用于演示.社交媒体.教育资源,还是其他创意项目,现在都可以更便 ...

  8. Spring + EHcache配置

    需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache Framework,要求可以Cache系统中Service或则DAO层的get/find等方法返回 ...

  9. Linux之远程挂载SSHFS

    SSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互. SFTP 是一 ...

  10. 开源 - Ideal库 - Excel帮助类,设计思路(一)

    今天开始和大家分享关于Excel最长常用操作封装. 01.起因 市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据.样式.公式.图表等等.而对于我们平时开发来 ...