Swagger 3.0 MybatisPlus 主键BigDecimal 使用过程问题

news/2024/11/18 14:49:15/文章来源:https://www.cnblogs.com/uoky/p/18552635

PS:本来用的是2.x的,但是因为换了后端框架,导致版本不适配,于是调整到3.0

        <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

由于由hibernate切换到了mybatisplus,导致主键的生成方式变化,使用Mybatisplus的代码生成器,自动生成的ID是BigDecimal 

    @TableId("ID")private BigDecimal id;

 

在使用Swagger接口文档中(http://xxx/swagger-ui/index.html)测试过程中发现BigDecimal 精度丢失,于是开始进行类型兼容

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import java.math.BigDecimal;@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 全局配置序列化返回 JSON 处理SimpleModule simpleModule = new SimpleModule();// 将使用String来序列化BigDecimal类型simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}
}

 

import com.fasterxml.classmate.TypeResolver;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;@Configuration
@EnableOpenApi
public class SwaggerConfig {@Autowiredprivate TypeResolver typeResolver;/*** 创建API应用* apiInfo() 增加API相关信息* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,* 本例采用指定扫描的包路径来定义指定要建立API的目录。** @return*///再定义一个Docket
    @Beanpublic Docket desertsApi2() {return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo("Swagger3.0", "1.0")).select().apis(RequestHandlerSelectors.basePackage("com.xxx.controller")).paths(PathSelectors.any()).build().directModelSubstitute(BigDecimal.class, String.class).additionalModels(typeResolver.resolve(XXX.class), typeResolver.resolve(XXXX.class)) //这里将'YourEntity'类加入swagger文档中,如果实体类没有在接口中作为入参,那么不会直接在Schemas中显示,所以这里可以手动列出一些Eentity类.groupName("xxxx").enable(true);}/*** 创建该API的基本信息(这些基本信息会展现在文档页面中)* 访问地址:http://ip:port/swagger-ui.html** @return*/private ApiInfo apiInfo(String title, String version) {return new ApiInfoBuilder().title(title).description("api信息").contact(new Contact("GMS", "", "")).termsOfServiceUrl("").version(version).build();}@Beanpublic static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {return new BeanPostProcessor() {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {customizeSpringfoxHandlerMappings(getHandlerMappings(bean));}return bean;}private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {List<T> copy = mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList());mappings.clear();mappings.addAll(copy);}@SuppressWarnings("unchecked")private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {try {Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");field.setAccessible(true);return (List<RequestMappingInfoHandlerMapping>) field.get(bean);} catch (IllegalArgumentException | IllegalAccessException e) {throw new IllegalStateException(e);}}};}
}

 

Mybatisplus 分页插件

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;import java.util.Collections;@EnableTransactionManagement
@Configuration
@MapperScan("com.xxx.mapper")
public class MybatisPlusConfig {/*** 分页插件 3.5.X* @author zhengkai.blog.csdn.net*/@Beanpublic PaginationInnerInterceptor paginationInnerInterceptor() {PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInterceptor.setMaxLimit(-1L);paginationInterceptor.setDbType(DbType.ORACLE);// 开启 count 的 join 优化,只针对部分 left joinpaginationInterceptor.setOptimizeJoin(true);return paginationInterceptor;}@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.setInterceptors(Collections.singletonList(paginationInnerInterceptor()));return mybatisPlusInterceptor;}
}

 

    public ApiResult page(XXXDTO xxxDTO, int current, int size) {IPage<CBRMLyt> page = new Page<>(current,size);QueryWrapper<CBRMLyt> queryWrapper = new QueryWrapper<>();if (null != xxxDTO.getXXX() && xxxDTO.getXXX().length > 0) {queryWrapper.in("XX", Arrays.asList(xxxDTO.getXXX()));}queryWrapper.orderByAsc("XX1", "XX2");return ApiResult.ok(lytMapper.selectPage(page, queryWrapper));}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836167.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

触想发布超薄紧凑型Z系列B款工控机,强固小巧,更薄更灵活!

工业电脑知名品牌触想智能,于近日发布旗下全系工控机中最纤薄一代——Z系列B款工控机TPC08-AIOT,破解小机身VS拓展性的结构悖论,34mm厚度的标准版机身上集成4个USB和COM、LAN、HDMI、12pin端子等完整接口功能,可适应狭窄空间和多I/O连接需求。搭载的RockchipRK3568处理器进…

OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD

前言深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明。  本篇,实现了一个左下角旋转HUD且背景透明的相机视口。 Demo HUD相机的坐标抬头HUD就是通过投影矩阵来实现,具体可参看《OSG开发笔记(二十):OSG使用HUD显示文字》Hud要单独创建一个新相机 注意关闭光…

高效处理日均5000亿+数据:58集团基于Apache SeaTunnel的数据集成平台架构优化

视频链接:58集团大数据平台基于Apache SeaTunnel的架构演进 https://www.bilibili.com/video/BV19GUPYcEgB/?vd_source=e139ecc995ab936267a7991b9de55f6c 引言 在数字化时代,数据已成为企业最宝贵的资产之一。58集团作为中国领先的生活服务平台,其大数据部在数据集成平台的…

私有部署、本地部署,哪种项目管理软件更适合你的项目?

选择私有部署还是本地部署的项目管理软件,取决于你的团队需求、项目特性、以及对安全性、控制权和可扩展性的要求。下面我们来分析两者的特点,并帮助你做出合适的选择: 1. 私有部署(Private Cloud / On-Premises)项目管理软件 私有部署指的是将项目管理软件部署在自有的服…

目前国内可用Docker镜像源汇总(截至2024年11月)

本文主要讲述了由于特殊原因国内的 Docker 镜像源出现问题,国内许多常见的镜像源如网易、百度等已不可用。文中介绍了中科大镜像源的暂时关闭情况,以及阿里镜像源包括私人阿里镜像加速器的使用方式,并提供了一些可用的镜像源地址和相应的设置配置代码,最后强调了使用 Docke…

京准电钟:NTP网络时间服务器是什么?功能是什么?

京准电钟:NTP网络时间服务器是什么?功能是什么?京准电钟:NTP网络时间服务器是什么?功能是什么? 京准电钟:NTP网络时间服务器是什么?功能是什么? 京准电钟官微——ahjzsz HR-901GB系列ntp网络时间服务器是一款专为国产信创设计的高精度北斗卫星授时设备,其核心功能是为…

从零开始学机器学习——聚类可视化RV

教程名称:使用 C# 入门深度学习 作者:痴者工良 地址: https://torch.whuanle.cn 目录* 微积分极限 导数求导公式 乘除求导例题 复合函数求导的链式法则 Sigmoid 函数的导数 求最小值问题微分 积分 偏导数多元函数定义域 多元函数的值:veee加速器 多元函数的极限 偏导数 全微…

cmu15545笔记-查询执行(Query Excution)Eu

目录* 执行模型Iterator Model Materialization Model Vectoriazation Model 对比数据访问方式:豆荚加速器Sequential Scan Index Scan Multi-Index ScanHalloween Problem 表达式求值执行模型 执行模型(Processing Model)定义了数据库系统如何执行一个查询计划。 Iterator M…

100 款支持 .NET 多版本的强大 WPF 控件库

前言 推荐一款集成了超过100款控件的流行 XAML 控件库,同时提供了一系列常用的 .NET 帮助类-CookPopularUI。它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现。 让我们一起学习如何使用 CookPopularUI,并详细了解其提供的丰富控件内容。 项目介绍 CookPopularUI…

广东电子MES系统SMT生产管理软件系统特点

电子mes系统SMT(表面贴装技术)生产管理软件系统的特点可以归纳如下: 实时性与准确性:SMT MES系统能够实时监控生产过程中的各个环节,确保生产过程的顺利进行。系统对生产过程中的数据进行准确采集和处理,保证了数据的真实性和可靠性。集成性与灵活性:SMT MES系统可以实现…

Avalonia使用

准备工作VS2022专业版 注意:如果需要嵌入主窗体中,那么那么一定要创建控件视图,我使用窗体视图嵌入失败了。 创建好这运行测试,必须运行成功。 (当前第一集 创建项目 下一集 创建登录窗体)

PowerQuery 工具2

PowerQuery 工具2 引用数据的两种常用方式方式1 由外部链接创建数据透视表 具体操作请参考PowerQuery 工具1 - 一只小小小飞猪 - 博客园,这里需要注意,如果给的数据源不存在不规范的类型,请直接跳过修改过程,直接在首页——关闭并上载至优点: 适用于原数据所在文件夹路径不…