把ResponseResultBodyAdvice类进行改造一下,代码有点多了
主要参考了org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler#handleException()方法, 有空可以看一下
@Slf4j
@RestControllerAdvice
public class ResponseResultBodyAdvice implements ResponseBodyAdvice<Object> {
private static final Class<? extends Annotation> ANNOTATION_TYPE = ResponseResultBody.class;
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ANNOTATION_TYPE) || returnType.hasMethodAnnotation(ANNOTATION_TYPE);
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Result) {
return body;
return Result.success(body);
* 提供对标准Spring MVC异常的处理
* @param ex the target exception
* @param request the current request
@ExceptionHandler(Exception.class)
public final ResponseEntity<Result<?>> exceptionHandler(Exception ex, WebRequest request) {
log.error("ExceptionHandler: {}", ex.getMessage());
HttpHeaders headers = new HttpHeaders();
if (ex instanceof ResultException) {
return this.handleResultException((ResultException) ex, headers, request);
return this.handleException(ex, headers, request);
protected ResponseEntity<Result<?>> handleResultException(ResultException ex, HttpHeaders headers, WebRequest request) {
Result<?> body = Result.failure(ex.getResultStatus());
HttpStatus status = ex.getResultStatus().getHttpStatus();
return this.handleExceptionInternal(ex, body, headers, status, request);
protected ResponseEntity<Result<?>> handleException(Exception ex, HttpHeaders headers, WebRequest request) {
Result<?> body = Result.failure();
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
return this.handleExceptionInternal(ex, body, headers, status, request);
* org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler#handleExceptionInternal(java.lang.Exception, java.lang.Object, org.springframework.http.HttpHeaders, org.springframework.http.HttpStatus, org.springframework.web.context.request.WebRequest)
* A single place to customize the response body of all exception types.
* <p>The default implementation sets the {@link WebUtils#ERROR_EXCEPTION_ATTRIBUTE}
* request attribute and creates a {@link ResponseEntity} from the given
* body, headers, and status.
protected ResponseEntity<Result<?>> handleExceptionInternal(
Exception ex, Result<?> body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
return new ResponseEntity<>(body, headers, status);
哥哥们,这个方案在Spring Boot中是没有侵入性但是在Spring Cloud OpenFeign的继承模式下是有侵入性,具体解决方案链接如下
https://blog.csdn.net/qq_34347620/article/details/124295302
很抱歉给大家埋坑了,
无侵入式 统一返回JSON格式其实本没有没打算写这篇博客的,但还是要写一下写这篇博客的起因是因为,现在呆着的这家公司居然没有统一的API返回格式????,询问主管他居然告诉我用HTTP状态码就够用了(fxxk),天哪HTTP状态码真的够用吗?在仔细的阅读了项目源码后发现,在API请求的是居然没有业务异常(黑人问好)。好吧 居然入坑了只能遵照项目风格了,懒得吐槽了。因为项目已经开发了半年多了, 要是全...
返回统一的JSON数据格式一、统一返回的JSON数据格式1. 列表数据2.分页数据3.没有返回数据4.失败统一定义格式二、创建统一结果返回类1. 创建接口定义返回码2. 创建结果类3. Controller中的返回统一数据格式的JSON举例
项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android,
Web)对数据的操作更一致、轻松。
一、统一返回的JSON数据格式
一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具
有这样一个页面 , 用来显示用户的账户记录数据,并且需要显示每个月的 收入 支出合计
,在分页的时候涉及到一些问题,需要对
返回的
Json格式做处理,处理起来比较麻烦,后端
返回的
Json数据格式形
式如下:
"code": "0",
"result": {
"monthAmount": [
"date": "2017-09",
一、什么是JSON?
1、JSON(JavaScript Object Notation):JavaScript 对象表示法
2、JSON 是是轻量级的文本数据交换格式。类似 XML,但 比 XML 更小、更快,更易解析。
3、JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
4、JSON 具有自我描述性,更易理解
1、Json格式(常用网站:www.bejson.com)
JSON格式的数据一般包括三组数据:{error_code:0;msg:"返回信息";data:[ ] }
error_code:错误码,0代表成功;
msg:对错误码的中文说明;
data:真正的返回数据
JSON数据的特点:
(1)json就是一种数据类型:整数、小数、字符串......
(2)json数据由两部分组成:
MAP对象,键值对:{key:value,key:value}
数组:[v
1.调用接口一般会返回string或json格式数据,想要使用数据,需要对数据进行解析,返回如下格式数据解析过程,以获取result数组下面的errMsg值为例
2.如果返回string格式数据,需要先将string转为JSONObject
JSONObject jsonResultObject = JSONObject.parseObject(result);
然后处理数据
//将JSONObject 对象 jsonResultObject 以result 为key的value 转为JSONA
最近公司项目出现这样一个问题,公司的项目部署在政务云服务器,而政务云服务器所在网络是电信提供的,如果用户通过手机的非电信4G网络访问项目资源,比如MP4等,则会被电信拦截,导致访问极慢无法正常提供服务。为了解决这个问题需要用cdn服务来提供资源,以前的资源都是存在服务器上,因此需要做最小的调整切换cdn服务。
解决方案:
在spring框架下,可以利用ResponseBodyAdvice接口,实现该接口则能够在声明了ResponseBody注解的controller返回json数据前,统一对json数据做处理,将资源地址的url统一替换为cdn资源url。
要使用Spring Boot实现一个Web接口,您需要执行以下步骤:
1. 创建一个Spring Boot项目:您可以使用Spring Initializer在线创建一个项目,或者使用命令行工具创建。
2. 定义控制器:您需要创建一个控制器类,并使用@RestController注解。
3. 实现GET请求:使用@GetMapping注解,实现一个处理GET请求的方法。
4. 实现POST请求:使用@PostMapping注解,实现一个处理POST请求的方法。
示例代码如下:
@RestController
public class MyController {
@GetMapping("/get")
public ResponseEntity<String> handleGet() {
return new ResponseEntity<>("Hello, World!", HttpStatus.OK);
@PostMapping("/post")
public ResponseEntity<String> handlePost(@RequestBody String requestBody) {
return new ResponseEntity<>("You posted: " + requestBody, HttpStatus.OK);
启动您的应用程序,然后就可以通过浏览器或其他工具发送GET和POST请求了。