‘com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor‘ 已经过时了导致出现返回total总为0的问题

文章讲述了在配置类MybatisPlusConfig中移除了已过时的依赖,并引入了一个更现代的Bean对象——PaginationInterceptor,该拦截器是针对mysql的分页插件,用于增强查询性能。

在配置类中去掉原有的依赖,他已经过时了
在这里插入图片描述
去掉之后
添加这个功能更多更新的Bean对象

@Configuration
public class MybatisPlusConfig {
    /**
     *   mybatis-plus分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor page = new PaginationInterceptor();
        page.setDialectType("mysql");
        return page;
    }
 
}
你给的 package com.app.service.impl; import java.util.List; import java.util.Map; import com.app.service.UsersService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.app.dao.UsersDao; import com.app.entity.UsersEntity; import com.app.utils.PageUtils; import com.app.utils.Query; /** 系统用户服务实现类 使用 MyBatis-Plus 3.5.3 + Spring Boot 3.5.3 + Java 17 @author */ @Service(“userService”) public class UsersServiceImpl extends ServiceImpl<UsersDao, UsersEntity> implements UsersService { /** 分页查询用户数据(基础版) @param params 查询参数 @return 分页工具对象 */ @Override public PageUtils queryPage(Map<String, Object> params) { // 创建分页对象(使用新版本Page类) Page page = new Query(params).getPage(); // 使用QueryWrapper替代过时的EntityWrapper QueryWrapper queryWrapper = new QueryWrapper<>(); // 执行分页查询 Page resultPage = baseMapper.selectPage(page, queryWrapper); return new PageUtils(resultPage); } /** 自定义条件查询用户列表 @param wrapper 查询条件包装器 @return 用户实体列表 */ @Override public List selectListView(Wrapper wrapper) { return baseMapper.selectListView(wrapper); } /** 分页查询用户数据(增强版) @param params 查询参数 @param wrapper 自定义查询条件 @return 分页工具对象 */ @Override public PageUtils queryPage(Map<String, Object> params, Wrapper wrapper) { // 创建分页对象(新版本构造方式) Page page = new Query(params).getPage(); // 执行分页查询(使用条件构造器) Page resultPage = baseMapper.selectListView(page, wrapper); return new PageUtils(resultPage); } } 出现了类“UsersServiceImpl”必须声明为抽象,或为实现“UsersService”中的抽象方法“selectList(Wrapper)”方法未从其超类重写方法不兼容的类型。实际为 Page',需要 'com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>'无法解析构造函数 ‘PageUtils(Page)‘方法未从其超类重写方法’com.app.service.impl.UsersServiceImpl’ 中的 ‘queryPage(Map<String, Object>, Wrapper)’ 与 ‘com.app.service.UsersService’ 中的 ‘queryPage(Map<String, Object>, Wrapper)’ 冲突;返回类型不兼容不兼容的类型。实际为 Page’,需要 'com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>‘不兼容的类型。实际为 java.util.List<com.app.entity.UsersEntity>’,需要 'com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>'无法解析构造函数 ‘PageUtils(Page)’ UsersService的代码如下package com.app.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.app.entity.UsersEntity; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.List; import java.util.Map; /** * 系统用户服务接口 */ public interface UsersService extends IService<UsersEntity> { /** * 分页查询用户 * @param params 查询参数 * @param wrapper 查询条件 * @return 分页结果 */ IPage<UsersEntity> queryPage(Map<String, Object> params, Wrapper<UsersEntity> wrapper); /** * 查询用户列表 * @param wrapper 查询条件 * @return 用户列表 */ List<UsersEntity> selectList(Wrapper<UsersEntity> wrapper); }
07-12
我的Query为 package com.app.utils; import com.baomidou.mybatisplus.plugins.Page; import org.apache.commons.lang3.StringUtils; import java.util.LinkedHashMap; import java.util.Map; /** * 查询参数 */ public class Query<T> extends LinkedHashMap<String, Object> { private static final long serialVersionUID = 1L; /** * mybatis-plus分页参数 */ private Page<T> page; /** * 当前页码 */ private int currPage = 1; /** * 每页条数 */ private int limit = 10; public Query(JQPageInfo pageInfo) { //分页参数 if(pageInfo.getPage()!= null){ currPage = pageInfo.getPage(); } if(pageInfo.getLimit()!= null){ limit = pageInfo.getLimit(); } //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险) String sidx = SQLFilter.sqlInject(pageInfo.getSidx()); String order = SQLFilter.sqlInject(pageInfo.getOrder()); //mybatis-plus分页 this.page = new Page<>(currPage, limit); //排序 if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){ this.page.setOrderByField(sidx); this.page.setAsc("ASC".equalsIgnoreCase(order)); } } public Query(Map<String, Object> params){ this.putAll(params); //分页参数 if(params.get("page") != null){ currPage = Integer.parseInt((String)params.get("page")); } if(params.get("limit") != null){ limit = Integer.parseInt((String)params.get("limit")); } this.put("offset", (currPage - 1) * limit); this.put("page", currPage); this.put("limit", limit); //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险) String sidx = SQLFilter.sqlInject((String)params.get("sidx")); String order = SQLFilter.sqlInject((String)params.get("order")); this.put("sidx", sidx); this.put("order", order); //mybatis-plus分页 this.page = new Page<>(currPage, limit); //排序 if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){ this.page.setOrderByField(sidx); this.page.setAsc("ASC".equalsIgnoreCase(order)); } } public Page<T> getPage() { return page; } public int getCurrPage() { return currPage; } public int getLimit() { return limit; } }
07-12
package com.hvlink.service.impl; import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hvlink.entity.dto.asn.AsnPackDTO; import com.hvlink.entity.param.asn.AsnPackExportParam; import com.hvlink.entity.param.asn.AsnPackLabelParam; import com.hvlink.entity.po.asn.AsnPackPO; import com.hvlink.entity.vo.asn.AsnPackLabelVO; import com.hvlink.mapper.asn.AsnPackMapper; import com.hvlink.pagination.PageResult; import com.hvlink.service.IAsnPackService; import com.hvlink.utils.BeanCopyUtils; import com.hvlink.utils.QRCodeUtils; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * ASN包装信息(AsnPack)表服务实现类 * * @author sunzhuang * @since 2025-09-23 16:39:02 */ @Slf4j @RequiredArgsConstructor @Service("asnPackService") public class AsnPackServiceImpl extends ServiceImpl<AsnPackMapper, AsnPackPO> implements IAsnPackService { private final AsnPackMapper asnPackMapper; /** * 查询标签信息 * * @param asnPackLabelParam 请求参数 * @return 查询结果 */ @Override public PageResult<AsnPackLabelVO> queryPage(AsnPackLabelParam asnPackLabelParam) { // 查询标签数据 Page<AsnPackDTO> page = new Page<>(asnPackLabelParam.getPageIndex(), asnPackLabelParam.getPageSize()); Page<AsnPackDTO> dtoPage = asnPackMapper.queryLabelPage(page, asnPackLabelParam); // 转换 DTO 到 VO List<AsnPackLabelVO> voList = Collections.emptyList(); if (!CollectionUtils.isEmpty(dtoPage.getRecords())) { voList = dtoPage.getRecords().stream() .map(dto -> BeanCopyUtils.copyBean(dto, AsnPackLabelVO.class)) .collect(Collectors.toList()); } // 构建分页结果 PageResult<AsnPackLabelVO> result = new PageResult<>(); result.setRecords(voList); result.setTotal(dtoPage.getTotal()); result.setPageIndex(asnPackLabelParam.getPageIndex()); result.setPageSize(asnPackLabelParam.getPageSize()); return result; } @Override public Mono<ResponseEntity<Resource>> exportLabels(AsnPackExportParam exportParam) { return Mono.defer(() -> { try { // 参数验证 if (exportParam == null || exportParam.getIds() == null || exportParam.getIds().isEmpty()) { return Mono.error(new IllegalArgumentException("导出参数或ID列表不能为空")); } // 查询导出数据 List<AsnPackDTO> exportData = asnPackMapper.selectByIds(exportParam.getIds()); if (exportData.isEmpty()) { return Mono.error(new RuntimeException("未找到导出数据")); } // 验证导出类型 if (!isValidExportType(exportParam.getExportType())) { return Mono.error(new IllegalArgumentException("不支持的导出类型: " + exportParam.getExportType())); } // 根据导出类型选择模板 String templatePath = getTemplatePath(exportParam.getExportType()); // 生成PDF字节数组 byte[] pdfBytes = generatePdfBytes(exportData, exportParam.getExportType(), templatePath); // 创建资源 Resource resource = new ByteArrayResource(pdfBytes); // 设置响应头 String fileName = buildFileName(exportParam.getExportType()); ResponseEntity<Resource> responseEntity = ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"") .contentType(MediaType.APPLICATION_PDF) .contentLength(pdfBytes.length) .body(resource); return Mono.just(responseEntity); } catch (Exception e) { log.error("标签导出失败", e); return Mono.error(new RuntimeException("标签导出失败: " + e.getMessage())); } }); } private String getTemplatePath(String exportType) { switch (exportType.toUpperCase()) { case "P": return "static/templates/P.pdf"; // 托标签模板 case "C": return "static/templates/C.pdf"; // 箱标签模板 case "B": return "static/templates/B.pdf"; // 包标签模板 default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } } private boolean isValidExportType(String exportType) { if (exportType == null) return false; String type = exportType.toUpperCase(); return type.equals("P") || type.equals("C") || type.equals("B"); } private String buildFileName(String exportType) { String typeName = ""; switch (exportType.toUpperCase()) { case "P": typeName = "托标签"; break; case "C": typeName = "箱标签"; break; case "B": typeName = "包标签"; break; default: typeName = "标签"; } // 构建文件名 String fileName = typeName + "_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".pdf"; try { // 对文件名进行URL编码 return java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); } catch (Exception e) { log.warn("文件名编码失败,使用默认文件名", e); return "export_" + System.currentTimeMillis() + ".pdf"; } } private byte[] generatePdfBytes(List<AsnPackDTO> data, String exportType, String templatePath) throws Exception { ClassPathResource templateResource = new ClassPathResource(templatePath); if (!templateResource.exists()) { throw new RuntimeException("模板文件不存在: " + templatePath); } try (InputStream templateStream = templateResource.getInputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { PdfReader reader = new PdfReader(templateStream); PdfStamper stamper = new PdfStamper(reader, outputStream); AcroFields form = stamper.getAcroFields(); // 添加中文字体支持 BaseFont simSunFont = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); form.addSubstitutionFont(simSunFont); // 填充第一个数据项 AsnPackDTO item = data.get(0); fillFormFields(form, item, exportType); // 添加二维码到指定位置 addQRCode(stamper, form, item, exportType); stamper.setFormFlattening(true); // 将表单转为静态文本 stamper.close(); // 关闭 stamper 会自动写入修改后的内容 reader.close(); return outputStream.toByteArray(); } } private void fillFormFields(AcroFields form, AsnPackDTO item, String exportType) throws Exception { Map<String, String> fieldValues = buildFieldValues(item, exportType); log.info("要填充的数据: {}", fieldValues); // 填充表单字段 for (Map.Entry<String, String> entry : fieldValues.entrySet()) { String fieldName = entry.getKey(); String fieldValue = entry.getValue(); if (form.getFields().containsKey(fieldName)) { if (StringUtils.hasText(fieldValue)) { try { form.setField(fieldName, fieldValue); log.info("成功填充字段: {} = {}", fieldName, fieldValue); } catch (Exception e) { log.error("填充字段失败: {}, 值: {}", fieldName, fieldValue, e); } } else { log.warn("字段值为空: {}", fieldName); } } else { log.warn("未找到表单字段: {}", fieldName); } } } private Map<String, String> buildFieldValues(AsnPackDTO item, String exportType) { Map<String, String> values = new HashMap<>(); // 公共字段 values.put("part_desc", item.getPartDesc()); values.put("part_code", item.getPartCode()); values.put("supplier_name", item.getSupplierName()); values.put("supplier_code", item.getSupplierCode()); values.put("order_no", item.getAsnNo()); values.put("production_batch", item.getProductionBatch()); values.put("case_code", generateCaseCode(item, exportType)); values.put("remark", item.getRemark()); // 数量相关字段 switch (exportType.toUpperCase()) { case "P": values.put("quantity", formatQuantity(item.getQuantity())); values.put("pack_quantity", formatQuantity(item.getPackQuantity())); values.put("unique_code", generateUniqueCode("P", item.getSupplierCode())); values.put("master_label", "MASTER LABEL " + item.getWarehouseCode()); break; case "C": values.put("quantity", formatQuantity(item.getQuantity())); values.put("pack_quantity", formatQuantity(item.getPackQuantity())); values.put("unique_code", generateUniqueCode("C", item.getSupplierCode())); break; case "B": values.put("quantity", formatQuantity(item.getQuantity())); values.put("pack_quantity", formatQuantity(item.getPackQuantity())); values.put("unique_code", generateUniqueCode("B", item.getSupplierCode())); break; } return values; } private String generateCaseCode(AsnPackDTO item, String exportType) { switch (exportType.toUpperCase()) { case "P": return "1/1"; // X/Y格式 case "C": return "1/5-1"; // X/Y-Z格式 case "B": return "1/10-C-1"; // X/Y-C-Z格式 default: return item.getCaseCode(); } } private String generateUniqueCode(String prefix, String supplierCode) { SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); String dateStr = sdf.format(new Date()); String sequence = String.format("%06d", System.currentTimeMillis() % 1000000); return prefix + supplierCode + dateStr + sequence; } private String formatQuantity(Double quantity) { return quantity != null ? String.valueOf(quantity) : "0"; } private void addQRCode(PdfStamper stamper, AcroFields form, AsnPackDTO item, String exportType) throws Exception { try { String uniqueCode = generateUniqueCode( exportType.equals("P") ? "P" : exportType.equals("C") ? "C" : "B", item.getSupplierCode() ); // 生成二维码 ByteArrayOutputStream qrCodeStream = QRCodeUtils.generateQRCode(uniqueCode, 100, 100); Image qrCodeImage = Image.getInstance(qrCodeStream.toByteArray()); // 获取字段位置 List<AcroFields.FieldPosition> fieldPositions = form.getFieldPositions("QRcode"); if (fieldPositions == null || fieldPositions.isEmpty()) { log.warn("未找到 QRcode 字段的位置信息"); return; } AcroFields.FieldPosition position = fieldPositions.get(0); int pageNo = position.page; Rectangle rect = position.position; PdfContentByte canvas = stamper.getOverContent(pageNo); // 使用上层绘制,避免干扰底层 qrCodeImage.setAbsolutePosition(rect.getLeft(), rect.getBottom()); qrCodeImage.scaleToFit(rect.getWidth(), rect.getHeight()); canvas.addImage(qrCodeImage); } catch (Exception e) { log.error("添加二维码失败", e); throw e; // 显式抛出便于调试 } } } 导出的PDF把其他资源覆盖了,导出后只显示填充的字段是为什么?
最新发布
10-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值