一、统一结果响应

为了与前端进行数据交互时,能有一个统一的数据结构,一般我们都需要一个统一响应结果类。

package com.kjyfx.response;import java.io.Serializable;public class BaseResponse<T> implements Serializable {private static final long serialVersionUID = 3997124446365032582L;/*** 返回消息*/private String message;/*** 返回对象*/private T data;/*** 是否成功*/private Boolean state;/*** 自定义错误码*/private Integer code;/*** 错误,系统异常** @return result*/public static BaseResponse renderError() {BaseResponse response = new BaseResponse();response.setState(Boolean.FALSE);response.setCode(500);return response;}/*** 错误数据(带消息)** @param msg 需要返回的消息* @return result*/public static BaseResponse renderError(String msg) {BaseResponse response = BaseResponse.renderError();response.setMessage(msg);return response;}/*** 错误数据(带消息)** @param msg 需要返回的消息* @return result*/public static BaseResponse renderError(String msg, Integer code) {BaseResponse response = BaseResponse.renderError();response.setMessage(msg);response.setCode(code);return response;}/*** 成功数据** @return result*/public static BaseResponse renderSuccess() {BaseResponse response = new BaseResponse();response.setState(Boolean.TRUE);response.setCode(200);return response;}/*** 成功数据(带信息)** @param msg 需要返回的信息* @return result*/public static BaseResponse renderSuccess(String msg) {BaseResponse response = BaseResponse.renderSuccess();response.setMessage(msg);return response;}/*** 成功数据(带数据)** @param obj 需要返回的对象* @return result*/public static BaseResponse renderSuccess(Object obj) {BaseResponse response = BaseResponse.renderSuccess();response.setData(obj);return response;}/*** 成功数据(带数据,带信息)** @param msg 需要返回的信息* @param obj 需要返回的对象* @return result*/public static BaseResponse renderSuccess(String msg, Object obj) {BaseResponse response = BaseResponse.renderSuccess();response.setMessage(msg);response.setData(obj);return response;}/*** 失败数据** @return result*/public static BaseResponse renderFail() {BaseResponse response = new BaseResponse();response.setState(Boolean.FALSE);response.setCode(500);return response;}/*** 失败数据(带消息)** @param msg 需要返回的消息* @return result*/public static BaseResponse renderFail(String msg) {BaseResponse response = BaseResponse.renderFail();response.setMessage(msg);return response;}/*** 失败数据(带消息)** @param msg 需要返回的消息* @param code 自定义错误码* @return result*/public static BaseResponse renderFail(String msg, Integer code) {BaseResponse response = BaseResponse.renderFail();response.setMessage(msg);response.setCode(code);return response;}/*** 失败数据(带数据,带信息)** @param msg 需要返回的信息* @param obj 需要返回的对象* @return result*/public static BaseResponse renderFail(String msg, Object obj) {BaseResponse response = BaseResponse.renderFail();response.setMessage(msg);response.setData(obj);return response;}/*** 失败数据(带数据,带信息)** @param msg 需要返回的信息* @param obj 需要返回的对象* @param code 自定义错误码* @return result*/public static BaseResponse renderFail(String msg, Object obj, Integer code) {BaseResponse response = BaseResponse.renderFail();response.setMessage(msg);response.setData(obj);response.setCode(code);return response;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Boolean getState() {return state;}public void setState(Boolean state) {this.state = state;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}
}

接下来我们就可以用统一结果响应类进行数据交互

@RequestMapping("/getUser")
public BaseResponse getUser(){SysUser sysUser = new SysUser().setId(1000L).setAccount("moyun").setUserName("墨云");return BaseResponse.renderSuccess("成功!",sysUser);
}

访问接口:http://localhost:9000/base/sysUser/getUser,得到如下数据,统一的数据结构,也方便前端请求接口之后的统一响应拦截处理

从code状态码跟state查看数据信息就很清晰

{"message": "成功!","data": {"id": 1000,"account": "moyun","password": null,"userName": "墨云","tel": null,"status": null,"createUser": null,"createType": null,"createTime": null,"updateTime": null},"state": true,"code": 200
}

一般在实际项目中,见得最多的就是BaseResponse和JsonResult这两个统一响应结果类,命名看个人习惯,内部结构都大同小异

成功结果,常用以下四个静态方法

BaseResponse.renderSuccess();
BaseResponse.renderSuccess(String msg);
BaseResponse.renderSuccess(Object obj);
BaseResponse.renderSuccess(String msg, Object obj);

业务级错误结果,常用以下五个静态方法

BaseResponse.renderFail();
BaseResponse.renderFail(String msg);
BaseResponse.renderFail(String msg, Integer code);
BaseResponse.renderFail(String msg, Object obj);
BaseResponse.renderFail(String msg, Object obj, Integer code);

系统级错误结果,可用以下三个静态方法(不常用,只是与业务级错误进行区分)

BaseResponse.renderError();
BaseResponse renderError(String msg);
BaseResponse renderError(String msg, Integer code);

二、全局异常处理

全局异常处理类主要用于,当服务器出现异常时,将捕获到的异常信息以json数据返给前端。

先自定义一个异常类,继承RuntimeException

package com.kjyfx.exception;public class MsgException extends RuntimeException{public MsgException() {}public MsgException(String message) {super(message);}public MsgException(String message, Throwable cause) {super(message, cause);}public MsgException(Throwable cause) {super(cause);}protected MsgException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

再定义一个全局异常处理器,可以自行添加其他异常处理

package com.kjyfx.exception;import com.kjyfx.response.BaseResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;@RestControllerAdvice
public class GlobalExceptionHandler {private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = MsgException.class)public BaseResponse msgExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {logger.error(e.getMessage());e.printStackTrace();return BaseResponse.renderFail(e.getMessage());}@ExceptionHandler(value = NullPointerException.class)public BaseResponse nullExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {logger.error(e.getMessage());e.printStackTrace();return BaseResponse.renderFail("出现了空指针!");}@ExceptionHandler(value = org.springframework.web.servlet.NoHandlerFoundException.class)public BaseResponse noHandlerFoundExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {logger.error(e.getMessage());return BaseResponse.renderFail("404,未找到请求地址");}@ExceptionHandler(value = IllegalArgumentException.class)public BaseResponse illegalArgumentExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {logger.error(e.getMessage());e.printStackTrace();return BaseResponse.renderFail(e.getMessage());}@ExceptionHandler(value = SQLException.class)public BaseResponse sQLExceptionExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {logger.error(e.getMessage());return BaseResponse.renderFail("数据库查询异常");}}

当我们访问以下接口时,sysUser对象恒为空,此时就会抛出一个MsgException

@RequestMapping("/getUser")
public SysUser getUser(){SysUser sysUser = null;if(null == sysUser){throw new MsgException("服务器报了一个错");}return new SysUser();
}

此时我们访问接口:http://localhost:9000/base/sysUser/getUser

就会得到以下数据,便是全局异常处理器为我们处理的

{"message": "服务器报了一个错","data": null,"state": false,"code": 500
}

全局异常处理器最主要的两个注解,

@RestControllerAdvice:作用于类上,相当于Controller的切面,对异常统一处理,定制,之后再以json格式返给前端

@ExceptionHandler:统一处理某一类异常,作用于方法上,捕捉到相应异常后,会执行其修饰的方法

例如:执行到第四行的时候肯定会报空指针异常

@RequestMapping("/getUser")
public SysUser getUser(){SysUser sysUser = null;sysUser.setId(1000L);return new SysUser();
}

访问接口后,将会得到全局异常处理器返回的数据

{"message": "出现了空指针!","data": null,"state": false,"code": 500
}

三、JSON数据处理

对于以上得到的json数据,如果对象属性没有赋值,则会显示为null值,对前端来说这是很不友好的,一不小心整个页面就会瘫痪,接下来我们用SpringBoot自带的Jackson对数据进行转换,将null处理为""空串

创建JacksonConfig配置类:

package com.kjyfx.config;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;/**
@Configuration
public class JacksonConfig {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();SerializerProvider serializerProvider = objectMapper.getSerializerProvider();serializerProvider.setNullValueSerializer(new JsonSerializer<Object>() {@Overridepublic void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {jsonGenerator.writeString("");}});return objectMapper;}}

@Primary:

当Spring容器扫描到某个接口的多个 bean 时,如果某个bean上加了@Primary 注解 ,则这个bean会被优先选用

@ConditionalOnMissingBean:

它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,

它会保证你的bean只有一个,即你的实例只有一个

之后我们重启项目,再访问接口,会得到以下数据,null成功被转成了""空串

{"message": "成功!","data": {"id": 1000,"account": "moyun","password": "","userName": "墨云","tel": "","status": "","createUser": "","createType": "","createTime": "","updateTime": ""},"state": true,"code": 200
}

四、福利

好了,今天的分享就到这里,除开这些分享的内容,我还为每位粉丝准备了一份大厂面试题的资料福利,有需要的可以点击下方名片领取

分享几种Spring Boot常用数据处理方式(含代码,粘贴可用)相关推荐

  1. SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)

    保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码. 数据库表 CREATE TA ...

  2. 40 个 Spring Boot 常用注解

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...

  3. spring boot 常用项目文件结构

    spring boot 常用项目文件结构 文件结构 文件结构 src/main/java 开发代码以及主程序入口 Application.java作为程序主入口,建议放在根目录下,主要用于一些框架配置 ...

  4. spring boot 有哪些方式可以实现热部署?

    spring boot 有哪些方式可以实现热部署? Spring Loaded spring-boot-devtools JRebel插件 具体操作参考: https://blog.csdn.net/ ...

  5. springboot导入项目依赖报错_如何解决spring boot 项目导入依赖后代码报错问题

    如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15  14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片) ​ 针对图中所示的 ...

  6. 4种Spring Boot 实现通用 Auth 认证方式

    摘要: 文章介绍了 spring-boot 中实现通用 auth 的四种方式,包括传统 AOP.拦截器.参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下它们的执行顺序. 本文分享自华为云社 ...

  7. 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 目前 ...

  8. 一个mapper接口有多个mapper.xml 文件_爱了!分享一个基于Spring Boot的API、RESTful API项目种子(骨架)!...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! 1.☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 2.☞ <Jav ...

  9. 强哥的分享--如何使用Spring Boot做一个邮件系统

    http://springboot.fun/ actuator是单机. 集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -D ...

最新文章

  1. 3分钟快速实现:9种经典排序算法的可视化
  2. 获取鼠标在盒子中的坐标
  3. android wlan0 网卡过程,android WIFI网络驱动之wpa_supplicant程序详解
  4. Canvas实现文字粒子化,并且绕轴旋转(完善)
  5. Asp.Net Core 中IdentityServer4 实战之角色授权详解
  6. JVM内存原理及高级特性
  7. django存入mysql数据库_django如何存数据到一个mysql数据表里面
  8. c#Ice开发之环境配置(一)
  9. 三维点云学习(3)6- 实现K-Means
  10. 发布后500访问错误 —— dll引用错误
  11. 苦劝学弟学妹们,explain一定要学明白,以后有大用途
  12. Log4J发日志邮件给多个接收者及标题、正文乱码问题
  13. 基于语音识别的智能垃圾分类控制系统设计
  14. css设置div垂直居中
  15. 馈线中的VSWR电压驻波比
  16. 大话西游2服务器维护公告,2017年02月23日停机维护公告
  17. excel求回归直线方程的公式_如何用excel快速求线性回归方程?
  18. 通达信筹码循环指标源码 显示吸筹拉升出货的过程
  19. 用发型、妆容和面部形态解释人脸识别准确性的性别差异;在CARLA实施的基于交叉口情况覆盖的自动驾驶车辆验证和确认框架;迈向医学同行影响的Shapley价值图框架;确定运动想象脑机接口中各种用户状态和特
  20. MATLAB设计控制系统仿真实验,基于MATLAB的自动控制原理实验仿真系统的设计

热门文章

  1. 『前端实习笔记』前言 坎坷的找实习之路
  2. java alter session_java程序里面可以执行alter session之类的语句?
  3. python实现“幻影坦克”效果(点开图片是隐藏的另一张图)【详解】
  4. Linux API 网址转换(DWORD, IP,域名)
  5. android源生Browser分析---APP层基本架构
  6. JAVA面向对象程序设计-FeiGe快递系统-继承III
  7. linux kernle 同步原语
  8. 会写Python代码的人工智能Kite宣布支持Linux,“程序猿”要失业了?
  9. 重庆12岁男孩大毛带着7岁半的弟弟小毛逃学,跑到山里呆了13天
  10. 电脑快捷键操作以及常用知识大全