统一响应实体
package com.imooc.ad.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* Created by Qinyi.
*/
@Data//实现get,set
@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;
}
}
自定义注解:标记指定响应不需要统一拦截
package com.imooc.ad.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by Qinyi.
*/
@Target({ElementType.TYPE, ElementType.METHOD})//可以标识在类和方法上
@Retention(RetentionPolicy.RUNTIME)//运行时
public @interface IgnoreResponseAdvice {
}
package com.imooc.ad.advice;
import com.imooc.ad.annotation.IgnoreResponseAdvice;
import com.imooc.ad.vo.CommonResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* Created by Qinyi.
*/
@RestControllerAdvice//对响应实现统一拦截
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
@Override
@SuppressWarnings("all")
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {//响应是否拦截
//类对@IgnoreResponseAdvice注解标识,不被CommonResponseDataAdvic影响
if (methodParameter.getDeclaringClass().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
//方法对@IgnoreResponseAdvice注解标识,不被CommonResponseDataAdvic影响
if (methodParameter.getMethod().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
return true;
}
@Nullable
@Override
@SuppressWarnings("all")
public Object beforeBodyWrite(@Nullable Object o,
MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {//该方法目的时拦截CommonResponse响应
CommonResponse<Object> response = new CommonResponse<>(0, "");
if (null == o) {//o只响应对象
return response;
} else if (o instanceof CommonResponse) {
response = (CommonResponse<Object>) o;
} else {
response.setData(o);
}
return response;
}
}