一、统一接口返回规范
1、统一返回视图类
概述:所有的接口返回,都应按照该格式去进行返回给前端
PacketHttpRes_V32类:
@Data
@Accessors(chain = true)
@JsonIgnoreProperties(allowSetters = true, value = {"httpStatus"})
@ApiModel("PacketHttpRes_V32")
public class PacketHttpRes_V32<T> {
@ApiModelProperty(value = "结果码 200:成功 500:具体异常信息 400:参数异常 401:未授权的请求 403:无权访问")
@JSONField(name="ReturnCode")
private Integer returnCode;
@ApiModelProperty(value = "接口请求结果描述信息")
@JSONField(name="ReturnCode_Msg")
private String returnCode_Msg;
@ApiModelProperty(value = "错误码 0:正常 1:名称重复 2:不存在 3:数量超出限制 4:")
@JSONField(name="ResultCode")
private Integer resultCode;
@ApiModelProperty(value = "业务处理结果描述信息")
@JSONField(name="ResultCode_Msg")
private String resultCode_Msg;
@ApiModelProperty(value = "业务处理结果数据体")
@JSONField(name="Data")
private T data;
public PacketHttpRes_V32() {}
public PacketHttpRes_V32(Integer returnCode, String returnCode_Msg, Integer resultCode, String resultCode_Msg,
T data) {
super();
this.returnCode = returnCode;
this.returnCode_Msg = returnCode_Msg;
this.resultCode = resultCode;
this.resultCode_Msg = resultCode_Msg;
this.data = data;
}
}
为了更加方便使用,已对该类进行静态方法封装,如下:
public static <T> PacketHttpRes_V32<T> makeOKResponse() {
return new PacketHttpRes_V32<T>()
.setReturnCode(ReturnCode.success_code)
.setReturnCode_Msg(ReturnCode.success_message)
.setResultCode(ReturnCode.err_nomean_code)
.setResultCode_Msg(ReturnCode.err_nomean_message)
.setData(null);
}
public static <T> PacketHttpRes_V32<T> makeOKResponse(T data) {
return new PacketHttpRes_V32<T>()
.setReturnCode(ReturnCode.success_code)
.setReturnCode_Msg(ReturnCode.success_message)
.setResultCode(ReturnCode.err_nomean_code)
.setResultCode_Msg(ReturnCode.err_nomean_message)
.setData(data);
}
public static <T> PacketHttpRes_V32<T> makeOKResponse(String message) {
return new PacketHttpRes_V32<T>()
.setReturnCode(ReturnCode.success_code)
.setReturnCode_Msg(ReturnCode.success_message)
.setResultCode(ReturnCode.err_nomean_code)
.setResultCode_Msg(message);
}
public static <T> PacketHttpRes_V32<T> makeOKResponse(String message, Integer code, T data) {
return new PacketHttpRes_V32<T>()
.setReturnCode(ReturnCode.success_code)
.setReturnCode_Msg(ReturnCode.success_message)
.setResultCode(code)
.setResultCode_Msg(message)
.setData(data);
}
public static <T> PacketHttpRes_V32<T> makeFailResponse(String message) {
message = Optional.ofNullable(message).orElse(ReturnCode.server_exception_message);
return new PacketHttpRes_V32<T>()
.setReturnCode(ReturnCode.success_code)
.setReturnCode_Msg(ReturnCode.success_message)
.setResultCode(ReturnCode.err_nomean_code)
.setResultCode_Msg(message);
}
public static <T> PacketHttpRes_V32<T> makeResponse(Integer returnCode, String returnCodeMessage,
Integer resultCode, String resultCodeMessage, T data) {
return new PacketHttpRes_V32<T>()
.setReturnCode(returnCode)
.setReturnCode_Msg(returnCodeMessage)
.setResultCode(resultCode)
.setResultCode_Msg(resultCodeMessage)
.setData(data);
}
返回例子:
//正确例子
return PacketHttpRes_V32.makeOKResponse(shareTpBaseInfoPage);
//错误例子
PacketHttpRes_V32.setReturnCode(ReturnCode.success_code);
PacketHttpRes_V32.setReturnCode_Msg(ReturnCode.success_message);
PacketHttpRes_V32.setResultCode(ReturnCode.err_nomean_code);
PacketHttpRes_V32.setResultCode_Msg(ReturnCode.err_nomean_message);
PacketHttpRes_V32.setData(shareTpBaseInfoPage);
return PacketHttpRes_V32;
注意:
项目中有:PacketHttpRes 与 PacketHttpRes_V32 两个返回类,PacketHttpRes_V32 为最新的,使用最新的即可
旧版的部分接口使用PacketHttpRes ,所以不能删除PacketHttpRes 类。
2、字段统一返回大驼峰
之前项目都是通过对字段增加@JSONField(name=“XXX”),去将本返回小驼峰字段更改为大驼峰,这极大的耗费了工作时间。
@Configuration
public class FastJsonConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
SerializeFilter serializeFilter = new SimplePropertyPreFilter();
// fastjson转换为大驼峰并过滤掉knife4j的接口,避免导致在线文档出错
SerializeConfig.getGlobalInstance().addFilter(UiConfiguration.class,serializeFilter);
SerializeConfig.getGlobalInstance().addFilter(SwaggerResource.class,serializeFilter);
SerializeConfig.getGlobalInstance()
.propertyNamingStrategy = PropertyNamingStrategy.PascalCase;
// jackson转换为大驼峰
for (int i = 0; i < converters.size(); i++) {
if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper objectMapper = new ObjectMapper();
// 统一返回数据的输出风格
objectMapper.setPropertyNamingStrategy(
com.fasterxml.jackson.databind.PropertyNamingStrategy.UPPER_CAMEL_CASE);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converters.set(i, converter);
break;
}
}// end for
}
}