1.首先了解下面
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; } }
可以自己定义具体的错误类型。这个时候调用接口的时候就会出现下面的返回结构体。如有没有成功的可以联系本人,大家一起探讨。