开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
一.统一响应
1.创建通用响应对象定义
新增vo包并且添加CommonResponse类文件
package com.imooc.coupon.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* <h1>通用响应对象定义</h1>
* Created by Qinyi.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse<T> implements Serializable {
private Integer code;
private String message;
private T data;
public CommonResponse(Integer code, String message) {
this.code = code;
this.message = message;
}
}
代码说明:
- code,message,data:定义三个返回值
- CommonResponse:定义两个参数的返回值方法
- @NoArgsConstructor:无参构造方法
- @AllArgsConstructor:所有参数构造方法
2.忽略统一响应注解定义
新增annotation并且新增IgnoreResponseAdvice
package com.imooc.coupon.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <h1>忽略统一响应注解定义</h1>
* Created by Qinyi.
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}
3.统一响应
新增advice包且新增CommonResponseDataAdvice类文件
package com.imooc.coupon.advice;
/**
* <h1>统一响应</h1>
* Created by Qinyi.
*/
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
/**
* <h2>判断是否需要对响应进行处理</h2>
* */
@Override
@SuppressWarnings("all")
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
// 如果当前方法所在的类标识了 @IgnoreResponseAdvice 注解, 不需要处理
if (methodParameter.getDeclaringClass().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
// 如果当前方法标识了 @IgnoreResponseAdvice 注解, 不需要处理
if (methodParameter.getMethod().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
// 对响应进行处理, 执行 beforeBodyWrite 方法
return true;
}
/**
* <h2>响应返回之前的处理</h2>
* */
@Override
@SuppressWarnings("all")
public Object beforeBodyWrite(Object o,
MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
// 定义最终的返回对象
CommonResponse<Object> response = new CommonResponse<>(
0, ""
);
// 如果 o 是 null, response 不需要设置 data
if (null == o) {
return response;
// 如果 o 已经是 CommonResponse, 不需要再次处理
} else if (o instanceof CommonResponse) {
response = (CommonResponse<Object>) o;
// 否则, 把响应对象作为 CommonResponse 的 data 部分
} else {
response.setData(o);
}
return response;
}
}
代码说明:
- 重写了beforeBodyWrite和supports方法
- methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class):如果当前方法所在的类标识了 @IgnoreResponseAdvice 注解, 不需要处理
- methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class):如果当前方法标识了 @IgnoreResponseAdvice 注解, 不需要处理
- beforeBodyWrite:响应返回之前的处理,如果对象是null或者已经是 CommonResponse,不需要对data进行返回了