咱們在平常開發的過程當中,常常會要求統一返回數據格式。如要求統一訪問格式爲java
{ "success": 請求是否成功, "message": 請求消息, "data": 請求數據 }
那咱們要如何實現呢,接下來將演示接口自定義返回數據類型web
通常接口返回的數據格式的都是json,故如今pom.xml引入fastjson包spring
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
先建一個符合統一數據格式的實體類json
import lombok.Getter; import lombok.Setter; import java.io.Serializable; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/2/28 22:11 * Description : rest full 統一返回包裝類 */ @Setter @Getter public class ResultObjectModel<T> implements Serializable { /** * 返回是否成功 */ private Boolean success; /** * 提示信息 */ private String message; /** * 返回數據內容 */ private T data; public ResultObjectModel() { } public ResultObjectModel(Boolean success, String message, T data) { this.success = success; this.message = message; this.data = data; } /** * 返回成功 * @param data * @param <T> * @return */ public static <T> ResultObjectModel success(T data){ return new ResultObjectModel(true , "請求成功" , data); } /** * 返回成功 * @param message * @param data * @param <T> * @return */ public static <T> ResultObjectModel success(String message ,T data){ return new ResultObjectModel(true , message , data); } /** * 失敗 * @param message * @return */ public static ResultObjectModel fail(String message){ return new ResultObjectModel(true , message , null); } /** * 失敗 * @param message * @param data * @param <T> * @return */ public static <T> ResultObjectModel fail(String message ,T data){ return new ResultObjectModel(false , message , data); } }
而後修改Rest Full接口類api
import com.alibaba.fastjson.JSONObject; import com.wusy.demo.model.ResultObjectModel; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/2/24 21:54 * Description : */ @RestController @RequestMapping("/api/demo") public class HelloWorldController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public ResultObjectModel hello() { JSONObject json = new JSONObject(); json.put("name", "wusy"); json.put("company" , "xxxxxx科技有限公司"); return ResultObjectModel.success(json); } }
運行應用,打開瀏覽器,在地址欄輸入http://127.0.0.1:8787/api/demo/hello,觀察結果瀏覽器
到這裏咱們實現了單個接口的數據統一返回,可是通常一個應用的接口都很是多,若是每個接口都修改過去這顯然是不合理的,偉大的Spring怎麼會沒有考慮到這些呢,SpringBoot提供了ResponseBodyAdvice供咱們自定義返回數據格式。mvc
import com.wusy.demo.model.ResultObjectModel; 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.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/2/28 22:04 * Description : rest full 全局統一返回封裝 */ @RestControllerAdvice public class GlobalControllerAdvice implements ResponseBodyAdvice<Object> { /** * 判斷哪些須要攔截 * @param returnType * @param converterType * @return */ @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { //若是返回的數據是ResultObjectModel、Byte、String類型則不進行封裝 if( body instanceof ResultObjectModel || body instanceof Byte || body instanceof String) { return body; } return this.getWrapperResponse(request , body); } /** * 返回正常的信息 * @param request * @param data * @return */ private ResultObjectModel<Object> getWrapperResponse(ServerHttpRequest request, Object data) { return new ResultObjectModel<>(true, "請求成功" , data); } }
修改rest full接口類app
import com.alibaba.fastjson.JSONObject; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/2/24 21:54 * Description : */ @RestController @RequestMapping("/api/demo") public class HelloWorldController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public JSONObject hello() { JSONObject json = new JSONObject(); json.put("name", "wusy"); json.put("company" , "xxxxxx科技有限公司"); return json; } }
運行應用,打開瀏覽器,在地址欄輸入http://127.0.0.1:8787/api/demo/hello,觀察結果ide
經過對比先後請求結果可知,Rest Full接口自定義返回數據類型演示結束。this