引言
轻舟采纳前后端拆散架构,前后端数据传输次要应用 json 格局。对 json 格局数据进行对立约定,将为 HTTP 接口对接,调试带来不便。
格局约定
清单 1:返回信息格式约定源码示例
package site.syksy.qingzhou.web.response;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import java.io.Serializable;
/**
* @author Raspberry
*/
@Schema(title = "返回信息")
public class ResponseMessage<T> implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(title = "是否胜利")
private Boolean success;
@Schema(title = "数据")
private T data;
@Schema(title = "错误码")
private String errorCode;
@Schema(title = "错误信息")
private String errorMessage;
/**
* error display type:0 silent; 1 message.warn; 2 message.error; 4 notification; 9 page
*/
@Schema(title = "错误信息显示类型")
private Integer showType;
/**
* Convenient for back-end Troubleshooting: unique request ID
*/
@Schema(title = "惟一申请 ID")
private String traceId;
/**
* onvenient for backend Troubleshooting: host of current access server
*/
@Schema(title = "以后拜访服务器的主机")
private String host;
...... 省略局部代码,具体请到轻舟源码中查找......
}
ResponseMessage 类中的属性是根据 ant design pro 文档中举荐。
对立包装
约定好前后端交互数据格式后,咱们将在每个 HTTP 接口办法中对返回后果进行包装,但这样显得冗余。这些反复冗余的代码是否集中处理呢?当然是能够的!只需创立一个类,实现 ResponseBodyAdvice 接口,再加上一个注解 @RestControllerAdvice 就能实现对立对返回后果进行包装解决,具体请看清单 2 中的源码。
清单 2:对立包装返回信息源码示例
package site.syksy.qingzhou.web.response;
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 Raspberry
*/
@RestControllerAdvice
public class GeneralResponseBodyAdvice implements ResponseBodyAdvice<Object> {
private final static String PACKAGE_PATH = "site.syksy.qingzhou";
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {String className = methodParameter.getMethod().getDeclaringClass().getName();
if (className.startsWith(PACKAGE_PATH)) {return true;} else {return false;}
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {if (o instanceof ResponseMessage) {return o;}
if (o instanceof String) {return ResponseMessage.success(o).toJSON();}
return ResponseMessage.success(o);
}
}
GeneralResponseBodyAdvice 类中的两个办法解释如下:
- supports:通过查看 Controller 类包门路是否匹配 site.syksy.qingzhou,返回 ture , 则会执行 beforeBodyWrite 办法。
- beforeBodyWrite:先对 Controller 返回后果进行判断,是否已包装过(类型属于 ResponseMessage),是否是 String 类型(String 类型,后续转换器不会将其转成 json)。如果以上判断皆未通过,将对后果包装成 ResponseMessage 格局。
清单 2 示例中通过包门路来束缚,也可通过其它形式来束缚。不过留神,肯定要束缚范畴,否则如 springdoc-openapi 的接口也将包装,则拜访 swagger ui 时将不能正确解析。
结束语
本文介绍了轻舟前后端格局的约定,以及如何实现后果对立包装。这个计划并非完美无瑕,其中一个问题是 springdoc-openapi 生成的 swagger 文档中,返回后果未加上对立包装格局。不知是否有读者对解决这个问题感兴趣,能够给 springdoc-openapi 奉献一个 pr,为开源世界添砖加瓦。
参考文献
[1] Spring [EB/OL].https://spring.io/.2021-04-25
[2] Ant Design Pro [EB/OL].https://pro.ant.design/.2021-04-25
附录
轻舟源码地址:https://gitee.com/syksy/qingzhou
本文由博客一文多发平台 OpenWrite 公布!