ResponseBodyAdvice
這個類的作用,和@ControllerAdvice的作用。@ControllerAdvice是使得該註解的類能在所有@controller的Mapping接口調用是調用該方法
package com.why.greenhouse.front.config.advice; import com.why.greenhouse.front.config.advice.model.Response; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * @author why */ @ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice { /** * 此組件是否支持給定的控制器方法返回類型,這裏是json * @param returnType 返回json類型 * @param converterType 報文轉換爲指定 * @return 指定類型 */ @Override public boolean supports(MethodParameter returnType, Class converterType) { return converterType.equals(MappingJackson2HttpMessageConverter.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) { String requestPath = request.getURI().getPath(); if (requestPath.contains("/swagger") || requestPath.contains("/v2/api-docs")) { return body; } Response res; if (body instanceof Response){ return body; }else { res = new Response<>(body); } return res; } }
具體的結果體實體類如下:
package com.why.greenhouse.front.config.advice.model; /** * @author why * 系統設置統一數據結構 * @param <T> */ public class Response<T> { private String code; private String message; private String detailMessage; private T data; public Response() { } public Response(ErrorCode errorCode) { this.code = errorCode.getCode(); this.message = errorCode.getMsg(); this.detailMessage = null; this.data = null; } public Response(ErrorCode errorCode, String detailMessage) { this(errorCode); this.detailMessage = detailMessage; } public Response(T data) { this(CommonErrorCode.SUCCESS); this.data = data; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getDetailMessage() { return detailMessage; } public void setDetailMessage(String detailMessage) { this.detailMessage = detailMessage; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
錯誤接口定義如下:
package com.why.greenhouse.front.config.advice.model; /** * @author why */ public interface ErrorCode { /** * 獲取返回碼 * @return */ String getCode(); /** * 獲取返回消息 * @return */ String getMsg(); }
具體實現如下:
package com.why.greenhouse.front.config.advice.model; public enum CommonErrorCode implements ErrorCode{ /** * 成功情況下的統一返回值 */ SUCCESS("0000","成功"), FAILED("9999","失敗"), ; private String code; private String msg; CommonErrorCode(String code, String msg) { this.code = code; this.msg = msg; } @Override public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Override public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
可以自己定義具體的錯誤類型。這個時候調用接口的時候就會出現下面的返回結構體。如有沒有成功的可以聯繫本人,大家一起探討。