您当前的位置: 首页 >  ui

梁云亮

暂无认证

  • 4浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】Lombok中@SuperBuilder出错解决方案

梁云亮 发布时间:2022-07-14 15:45:17 ,浏览量:4

问题

假设

基础查询类:BaseQuery.java
@Setter
@Getter
@SuperBuilder    // ----------------1
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BaseQuery {
    /**
     * 页码
     */
    @ApiModelProperty(value = "页码")
    private Integer pageNum;

    /**
     * 页面大小
     */
    @ApiModelProperty(value = "页面大小")
    private Integer pageSize;

    /**
     * 查询关键字
     */
    @ApiModelProperty(value = "查询关键字")
    private String keywords;

    /**
     * 状态:1可用  2不可用
     */
    @ApiModelProperty(value = "状态 1上架  2下架")
    private Integer status;

    /**
     * 起止时间的类型 1创建时间(默认) 2修改时间
     */
    @ApiModelProperty(value = "起止时间的类型 1创建时间(默认) 2修改时间")
    private Integer dateType;

    /**
     * 开始时间
     */
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //返回时间类型
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") //接收时间类型
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //返回时间类型
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") //接收时间类型
    private LocalDateTime endTime;

    public Integer getPageNum() {
        return pageNum == null ? WeGoConst.PAGE_NUM : pageNum;
    }

    public Integer getPageSize() {
        return pageSize == null ? WeGoConst.PAGE_SIZE : pageSize;
    }
}
具体的查询类:SpuQuery.java
@ApiModel(value = "com-wego-domain-query-SpuQuery")
@Getter
@Setter
@SuperBuilder      //----------2
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class SpuQuery extends BaseQuery {
    /**
     * 类别id的集合:1,2,33,4,5,67
     */
    private String cids;
}
具体查询方法:
public PageBean getPage(SpuQuery spuQuery) {
    //分页
    Page page = new Page(spuQuery.getPageNum(), spuQuery.getPageSize());

    //查询条件
    QueryWrapper queryWrapper = new QueryWrapper();
    //动态构造条件查询时的查询条件
    Integer status = baseQuery.getStatus();
    if (status != null) {
        queryWrapper.eq("status", status);
    }

    Integer dateType = spuQuery.getDateType();
    LocalDateTime startTime = spuQuery.getStartTime();
    LocalDateTime endTime = spuQuery.getEndTime();
    if (dateType != null) {
       if (startTime != null && endTime != null) {
          //默认为创建时间
          queryWrapper.between("create_time", startTime.toString(), endTime.toString());
       } else{
          queryWrapper.between("update_time", startTime.toString(), endTime.toString());
       }
   }

    String keywords = spuQuery.getKeywords();
    if (StringUtils.hasText(keywords)) {
        queryWrapper.like("name", keywords)
                .or().like("info", keywords);
    }

    String cids = spuQuery.getCids();
    //如果pid为null则查询所有的顶级类别,否则查询相应的子类别
    if (cids != null) {
        queryWrapper.in("category_id", Arrays.asList(cids.split(",")));
    }

    //排序:默认按显示优先级降序排序,优先级相同按添加时间降序排序
    queryWrapper.orderByAsc("priority").orderByDesc("id").orderByDesc("sales_amount").orderByDesc("recommends");
    page(page, queryWrapper);

    //将MybatisPlus的Page对象转换成自定义的PageBean对象
    PageBean pageBean = PageBean.init(page);
    return pageBean;
}
测试:
@SpringBootTest
class SpuServiceImplTest {

    @Resource
    private SpuService spuService;

    @Test
    void getPage() {
        SpuQuery spuQuery = SpuQuery.builder()
                .cids("11,14,16")
                .keywords("a")
                .build();
        spuService.getPage(spuQuery);
    }
}

运行程序,出错。 问题应该是MyBatisPlus和Lombok不兼容。

解决方案 第一步:去除 BaseQuery中注解1处的@SuperBuilder代码 第二步;修改SpuQuery代码如下所示:
@Getter
@Setter
@ToString(callSuper = true)
@NoArgsConstructor
public class SpuQuery extends BaseQuery {
    /**
     * 类别id的集合:1,2,33,4,5,67
     */
    private String cids;

    @Builder
    public SpuQuery(String cids, Integer pageNum, Integer pageSize, String keywords, Integer status, Integer dateType, LocalDateTime startTime, LocalDateTime endTime) {
        super(pageNum, pageSize, keywords, status, dateType, startTime, endTime);
        this.cids = cids;
    }
}

注意:这种方式弊端也很明显:

  • 子类调用父类的全参构造,当父类参数数量、顺序调整时,子类也需要同步调整。
  • 如果父类参数过多,构造方法十分不优雅。
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.2582s