1.創建Result工具類
1.1 首先你可以創建枚舉類型用來標記狀態
public enum StatusTypeEnum {
/**
* 200爲成功
* 404爲錯誤信息
*/
SUCCESS(200, "success"),
ERROR(404, "error");
private String msg;
private int status;
public String getMsg() {
return msg;
}
public int getStatus() {
return status;
}
StatusTypeEnum(int status, String msg) {
this.status = status;
this.msg = msg;
}
}
1.2 之後創建一個Result 接口
這裏你可以什麼都不寫,方便以後擴展
public interface Result<T> {
}
1.3 創建SuccessResult和 ErrorResult 實現接口Result
可以使用Lombok生產set get 和 無參構造 和有參構造
SuccessResult
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SuccessResult<T> implements Result<T> {
private StatusTypeEnum type;
private int status;
private T data;
private String requestTime;
public static SuccessResult succes() {
return new SuccessResult<>(StatusTypeEnum.SUCCESS, StatusTypeEnum.SUCCESS.getStatus(), null, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
public static <T> SuccessResult succes(T data) {
return new SuccessResult<>(StatusTypeEnum.SUCCESS, StatusTypeEnum.SUCCESS.getStatus(), data, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
ErrorResult
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResult implements Result {
private int status;
private StatusTypeEnum type;
private String msg;
private String requestTime;
public static ErrorResult error(int status, Exception ex) {
return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, ex.getMessage(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
public static ErrorResult error() {
return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, null, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
public static ErrorResult error(String mag) {
return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, mag, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
2. 創建Result註解
package com.vip.webordertwo.utils.handler;
import org.springframework.web.bind.annotation.Mapping;
import java.lang.annotation.*;
/**
* @author Tang
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Mapping
@Documented
public @interface ResultParameter {
boolean isResult() default true;
}
3.結果統一處理,進行攔截
package com.vip.webordertwo.utils.handler;
import com.vip.webordertwo.utils.common.ErrorResult;
import com.vip.webordertwo.utils.common.SuccessResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* 返回統一的結果 RestControllerAdvice
* ResponseBodyAdvice 接口
* @author zhangwei
*/
@RestControllerAdvice
@Slf4j
public class GlobalResultAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return returnType.getMethod().isAnnotationPresent(ResultParameter.class);
}
/**
*
* @param body
* @param returnType
* @param selectedContentType
* @param selectedConverterType
* @param request
* @param response
* @return
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
Object resp = null;
if (body instanceof ErrorResult){
resp = body;
}else{
resp = SuccessResult.succes(body);
if((int) body == 0){
resp = ErrorResult.error();
}else {
resp = SuccessResult.succes(body);
}
}
return resp;
}
}