分享几种Spring Boot常用数据处理方式(含代码,粘贴可用)
一、统一结果响应
为了与前端进行数据交互时,能有一个统一的数据结构,一般我们都需要一个统一响应结果类。
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常用数据处理方式(含代码,粘贴可用)相关推荐
- SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)
保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码. 数据库表 CREATE TA ...
- 40 个 Spring Boot 常用注解
以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...
- spring boot 常用项目文件结构
spring boot 常用项目文件结构 文件结构 文件结构 src/main/java 开发代码以及主程序入口 Application.java作为程序主入口,建议放在根目录下,主要用于一些框架配置 ...
- spring boot 有哪些方式可以实现热部署?
spring boot 有哪些方式可以实现热部署? Spring Loaded spring-boot-devtools JRebel插件 具体操作参考: https://blog.csdn.net/ ...
- springboot导入项目依赖报错_如何解决spring boot 项目导入依赖后代码报错问题
如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15 14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片) 针对图中所示的 ...
- 4种Spring Boot 实现通用 Auth 认证方式
摘要: 文章介绍了 spring-boot 中实现通用 auth 的四种方式,包括传统 AOP.拦截器.参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下它们的执行顺序. 本文分享自华为云社 ...
- 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 目前 ...
- 一个mapper接口有多个mapper.xml 文件_爱了!分享一个基于Spring Boot的API、RESTful API项目种子(骨架)!...
点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! 1.☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 2.☞ <Jav ...
- 强哥的分享--如何使用Spring Boot做一个邮件系统
http://springboot.fun/ actuator是单机. 集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -D ...
最新文章
- 3分钟快速实现:9种经典排序算法的可视化
- 获取鼠标在盒子中的坐标
- android wlan0 网卡过程,android WIFI网络驱动之wpa_supplicant程序详解
- Canvas实现文字粒子化,并且绕轴旋转(完善)
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
- JVM内存原理及高级特性
- django存入mysql数据库_django如何存数据到一个mysql数据表里面
- c#Ice开发之环境配置(一)
- 三维点云学习(3)6- 实现K-Means
- 发布后500访问错误 —— dll引用错误
- 苦劝学弟学妹们,explain一定要学明白,以后有大用途
- Log4J发日志邮件给多个接收者及标题、正文乱码问题
- 基于语音识别的智能垃圾分类控制系统设计
- css设置div垂直居中
- 馈线中的VSWR电压驻波比
- 大话西游2服务器维护公告,2017年02月23日停机维护公告
- excel求回归直线方程的公式_如何用excel快速求线性回归方程?
- 通达信筹码循环指标源码 显示吸筹拉升出货的过程
- 用发型、妆容和面部形态解释人脸识别准确性的性别差异;在CARLA实施的基于交叉口情况覆盖的自动驾驶车辆验证和确认框架;迈向医学同行影响的Shapley价值图框架;确定运动想象脑机接口中各种用户状态和特
- MATLAB设计控制系统仿真实验,基于MATLAB的自动控制原理实验仿真系统的设计
热门文章
- 『前端实习笔记』前言 坎坷的找实习之路
- java alter session_java程序里面可以执行alter session之类的语句?
- python实现“幻影坦克”效果(点开图片是隐藏的另一张图)【详解】
- Linux API 网址转换(DWORD, IP,域名)
- android源生Browser分析---APP层基本架构
- JAVA面向对象程序设计-FeiGe快递系统-继承III
- linux kernle 同步原语
- 会写Python代码的人工智能Kite宣布支持Linux,“程序猿”要失业了?
- 重庆12岁男孩大毛带着7岁半的弟弟小毛逃学,跑到山里呆了13天
- 电脑快捷键操作以及常用知识大全