springboot中的統一響應處理方案
1、統一響應類 CommonResponse
package cn.bestriven.www.vo;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* @Author: liufan
* @Date: 2019/8/19 16:08
* @Description:
*/
@Data
@Component
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;
}
}
2、方法攔截器CommonResponseDataAdvice
package cn.bestriven.www.advice;
import cn.bestriven.www.annotation.IgnoreResponseAdvice;
import cn.bestriven.www.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;
/**
* @Author: liufan
* @Date: 2019/8/19 16:31
* @Description:
*/
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
/**
* 判斷是否攔截
* @param methodParameter 根據方法參數判斷
* @param aClass 根據類判斷
* @return
*/
@Override
@SuppressWarnings("all")
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
if(methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)){
return false;
}else if(methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)){
return false;
}else{
return true;
}
}
/**
* 在寫入響應前的操作
* @param o
* @param methodParameter
* @param mediaType
* @param aClass
* @param serverHttpRequest
* @param serverHttpResponse
* @return
*/
@Override
@Nullable
@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,"");
if(null == o ){
return response;
}else if(o instanceof CommonResponse){
response = (CommonResponse<Object>) o;
}else{
response.setData(o);
}
return response;
}
}
忽略轉換成統一響應的註解
package cn.bestriven.www.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author: liufan
* @Date: 2019/8/19 16:33
* @Description:
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}
springBoot中統一異常處理
1、統一異常類
package cn.bestriven.www.exception;
/**
* @Author: liufan
* @Date: 2019/8/19 16:40
* @Description:
*/
public class AdException extends Exception {
public AdException(String message){
super(message);
}
}
2、統一異常攔截器
package cn.bestriven.www.advice;
import cn.bestriven.www.exception.AdException;
import cn.bestriven.www.vo.CommonResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* @Author: liufan
* @Date: 2019/8/19 16:41
* @Description:
*/
@RestControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler(value = AdException.class)
public CommonResponse<String> handlerAdException(HttpServletRequest request,
AdException exception){
CommonResponse<String> response = new CommonResponse<>(-1,"error");
response.setData(exception.getMessage());
return response;
}
}