前言
后端接口现在使用的是knife4j,会遇到返回参数中嵌套显示的需求,但是会出现参数显示不全的问题,处理的办法是响应参数使用泛型处理,下面结合具体的场景说一下如何处理不显示问题.
场景说明一(两级嵌套)
pageInfo中list显示数据
使用pageHelper插件分页查询时返回的分页信息为pageInfo,固定显示的内容如下:
所有的业务查询数据都会放到list中显示.现在有会员销课记录查询需求,要求按照分页进行查询.接口文档使用knife4j进行展示,使用pageHelper进行分页查询处理.最终返回的数据格式如下:
相关代码如下:
控制层代码:
@ApiOperation("销课记录列表查询") public ResultVo<PageInfo<SignCourseRecord>> findSignCourseRecordList(SignCourseQueryDto signCourseQueryDto) { PageInfo<SignCourseRecord> signCourseRecordList = financeService.findSignCourseRecordList(signCourseQueryDto); return ResultVoUtil.success(signCourseRecordList); }
响应参数:
@ApiModel("签到记录信息") @Data public class SignCourseRecord { private Long courseRecordId; private String staffName; // 省略其他属性。。。。。。 }
场景说明二(三级嵌套)
现在需要查询售卡分页类表信息,同时要返回总数量以及总回款信息。相当于三级嵌套,实现效果如下:
相关代码:
控制层:
public ResultVo<SaleCardInfoVo<PageInfo<SaleStaffCardVo>>> findSaleStaffCardVos(SaleCardDto saleCardDto) { SaleCardInfoVo saleStaffCardVos = financeService.findSaleStaffCardVos(saleCardDto); return ResultVoUtil.success(saleStaffCardVos); }
响应实体类:
@ApiModel("售卡统计信息") public class SaleCardInfoVo<SaleStaffCardVo> implements Serializable { private static final long serialVersionUID = -6767885414660070855L; @ApiModelProperty(value = "总售卡数",example = "3",dataType = "long") private long totalCount; @ApiModelProperty(value = "回款总金额",example = "25.56",dataType = "BigDecimal") private BigDecimal totalIncomePrice=BigDecimal.ZERO; @ApiModelProperty(value = "未总收款金额",example = "25.56",dataType = "BigDecimal") private BigDecimal totalUnIncomePrice; @ApiModelProperty(value = "总应收金额",example = "25.56",dataType = "BigDecimal",hidden = true) private BigDecimal totalRealPrice=BigDecimal.ZERO; @ApiModelProperty(value = "售卡分页数据") private PageInfo<com.kawaxiaoyu.manage.management.api.brandFinance.vo.SaleStaffCardVo> saleStaffCardVos;} // 省略get/set
@ApiModel(value = "售卡统计信息") public class SaleStaffCardVo implements Serializable { private static final long serialVersionUID = -2298163108908959992L; @ApiModelProperty(value = "会员卡卡号",example = "2522",dataType = "String") private String cardNo; @ApiModelProperty(value = "会员姓名",example = "小白",dataType = "String") private String staffName; // 省略相关属性
封装统一响应信息:
@Data @Builder @Accessors(chain = true) @ApiModel("响应参数") public class ResultVo<T> implements Serializable { private static final long serialVersionUID = -8054007511410819665L; @ApiModelProperty(value = "响应状态码",example = "1",dataType = "Integer") private int code; // 是否成功标识.true表示成功,false表示失败 @ApiModelProperty("success标识,true表示成功,false表示失败") private boolean success; // 操作成功时需要响应给客户端的响应数据 @ApiModelProperty("响应信息") private String msg; @ApiModelProperty("响应数据") private T data; @ApiModelProperty("当前时间") @JSONField(format = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date time;
场景说明三(四级嵌套)
先说一下实现效果,商品规格信息:
控制层逻辑:
@ApiOperation(value = "商品规格信息查询",notes = "加入购物车以及立即购买时使用") @PostMapping("/findGoodsSpecList") public ApiResult<GoodsSpecInfo> findGoodSpecList(@RequestBody GoodSelectSpecReqParam goodsSelectSpecReqParam) throws Exception{ GoodSpecInfo goodSpecInfo = goodsService.findGoodSpecList(goodSelectSpecReqParam); return ApiResult.ok(goodsSpecInfo); }
响应实体类(二级):
@ApiModel("商品规格信息") @Data @ToString public class GoodsSpecInfo { // 默认规格商品信息 @ApiModelProperty(value = "默认规格信息",dataType = "DefaultGoodsInfoVo.class") private DefaultGoodsInfoVo defaultGoodsInfoVo; // 商品规格列表信息 @ApiModelProperty(value = "规格列表",dataType = "List.class") private List<GoodsSpecVo> goodsSpecVoList;
响应实体类(三级):
@ApiModel("商品规格列表实体类") @Data @ToString public class GoodsSpecVo { @ApiModelProperty(value = "规格id",example = "1",dataType = "Integer") private Integer specKeyId; @ApiModelProperty(value = "规格名",example = "1",dataType = "String") private String specKeyName; @ApiModelProperty(value = "规格项集合信息") private List<GoodsSpecValueVo> goodsSpecValueVoList;
响应实体类(四级):
@ApiModel("商品规格") @Data @ToString public class GoodsSpecValueVo { @ApiModelProperty(value = "规格项id",example = "1",dataType = "Integer") private Integer specValueId; @ApiModelProperty(value = "规格项名id",example = "1",dataType = "String") private String specValueName; // 新增是否显示规格 1-显示 2-不显示 @ApiModelProperty(value = "是否显示规格 1-显示 2-不显示",example = "1",dataType = "Integer") private Integer isShow=1;
注意如果实体类中的属性是集合,注意example和dataType可以不用设置.
以上是处理多级嵌套部分数据不显示问题的处理方案,希望对有相同需求的同学有所帮助!