首页 > 其他分享 >Swagger 3.0 & MybatisPlus 主键BigDecimal 使用过程问题

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

时间:2024-11-18 14:42:56浏览次数:1  
标签:MybatisPlus BigDecimal springframework return org import springfox 主键

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 精度丢失,于是开始进行类型兼容(PS:接口文档id入参全改成String,自动处理,无需额外处理)

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 {
    @Bean
    public 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 {

    @Autowired
    private TypeResolver typeResolver;
    /**
     * 创建API应用
     * apiInfo() 增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
     * 本例采用指定扫描的包路径来定义指定要建立API的目录。
     *
     * @return
     */
 
 
    //再定义一个Docket
    @Bean
    public 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();
    }
 
    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {
 
            @Override
            public 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
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInterceptor.setMaxLimit(-1L);
        paginationInterceptor.setDbType(DbType.ORACLE);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setOptimizeJoin(true);
        return paginationInterceptor;
    }
    @Bean
    public 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));
    }

 

 

标签:MybatisPlus,BigDecimal,springframework,return,org,import,springfox,主键
From: https://www.cnblogs.com/uoky/p/18552635

相关文章

  • 工作学习笔记(十)Java 中 “<” 运算符不能应用于BigDecimal和double
    一、问题描述在Java编程过程中,尝试使用“<”运算符对java.math.BigDecimal和double类型的数据进行比较时,出现了编译错误:“Theoperator<isundefinedfortheargumenttype(s)java.math.BigDecimal,double”。二、问题分析Java中的基本数据类型(如int、double等)......
  • springboot3整合mybatisplus问题Invalid value type for attribute 'factoryBeanObjec
    版本说明:JDK版本:17springboot版本:3.3.5问题分析:springboot版本与mybatisplus版本不兼容解决办法:将mybatisplus版本替换为以下版本<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>......
  • 主键命名
    为主键命名是一个看似简单但实际上非常重要的任务,因为良好的命名可以提高代码的可读性和维护性。以下是一些建议,帮助你为主键命名:简洁明了:主键名称应该尽量简洁,但要确保能够清楚地表达其用途。遵循命名约定:在团队或项目中,遵循一致的命名约定是非常重要的。例如,你可以约......
  • BigDecimal
    不精确的情况:publicclassBigDecimalDemo1{publicstaticvoidmain(String[]args){System.out.println(0.09+0.01);//0.09999999999999999System.out.println(0.216-0.1);//0.11599999999999999System.out.println(0.226*0.......
  • BigDecimal的基本用法
    初始化BigDecimalamount=newBigDecimal("15");加减乘除publicstaticvoidmain(String[]args){BigDecimalamount=newBigDecimal("15");BigDecimalamount2=newBigDecimal("3");//加BigDecima......
  • SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略
    SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略随着互联网技术的飞速发展,Web应用的安全问题日益凸显,其中SQL注入攻击是最常见的安全威胁之一。SQL注入攻击不仅可能导致敏感数据泄露,还可能引发数据篡改、服务中断等严重后果。本文将详细介绍SQL注入攻击的基本概念......
  • vue,for循环为什么不提倡放主键id
    在Vue.js中,v-for循环用于渲染列表时,推荐为每个列表项提供一个key属性,以帮助Vue更高效地更新和复用DOM元素。但是,使用主键id作为key有时并不推荐,原因如下:1.id不一定稳定主键id通常是在数据库中生成的唯一标识符,虽然在数据库中它是唯一的,但在前端应用中,尤其是在......
  • Java面试系列-MySQL面试题20道,InnoDB,索引类型,事务隔离级别,锁机制,MVCC,主从复制,慢查询,分
    文章目录1.MySQL中的InnoDB和MyISAM存储引擎有什么区别?2.MySQL中的索引类型有哪些?3.MySQL中的索引是如何工作的?4.MySQL中的事务隔离级别有哪些?5.MySQL中的锁机制有哪些?6.MySQL中的MVCC(多版本并发控制)是如何工作的?7.MySQL中的主从复制是如何工作的?8.MySQL中的分区......
  • mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
    @目录背景说明背景说明我这里主要针对2处地方要进行增量执行sql:1.新功能需要创建一张新表结构indicator_alarm_threshold2.给菜单表和另一个表新增数据我们现在使用的是项目启动先初始化加载init-table.sql的脚本(这里面的轻易不动了,保持原结构数据),然后还有个用于后续迭......
  • MySQL从节点异常宕机重启后遇到主键冲突
    一台虚机在迁移过程中遇到点问题,然后运维做了重启的操作。重启后,发现该虚机中的mysql从库与主库的同步失败了。登录后查看,发现sqlthread停止运行了:mysql>showslavestatus\G***************************1.row***************************Slave_IO_St......