专栏首页用户1337634的专栏自定义枚举 --- Swagger文档展示

自定义枚举 --- Swagger文档展示

在其它两篇文章中,已经解决的自定义枚举在MyBatis以及Rest接口的转换,但是在Springfox中还存在问题,不能使用code来作为api。本文通过扩展Springfox,实现了对自定义枚举的良好支持。

ps: 枚举的定义参见 自定义枚举 --- MyBatis字段映射

当前

Springfox默认枚举

存在2个问题

  1. 类型显示为string,需要修改为integer
  2. 枚举的类型显示为枚举值,需要修改为枚举的code值(CodedEnum的定义请参见其他文章)

扩展后

扩展Springfox后的枚举展示

实现方式

实现ModelPropertyBuilderPlugin接口,

@Component
public class CodedEnumPropertyPlugin implements ModelPropertyBuilderPlugin {
    @Override
    public void apply(ModelPropertyContext context) {
        Optional<ApiModelProperty> annotation = Optional.absent();

        if (context.getAnnotatedElement().isPresent()) {
            annotation = annotation.or(ApiModelProperties.findApiModePropertyAnnotation(context.getAnnotatedElement().get()));
        }
        if (context.getBeanPropertyDefinition().isPresent()) {
            annotation = annotation.or(Annotations.findPropertyAnnotation(
                    context.getBeanPropertyDefinition().get(),
                    ApiModelProperty.class));
        }
        final Class<?> rawPrimaryType = context.getBeanPropertyDefinition().get().getRawPrimaryType();
        //过滤得到目标类型
        if (annotation.isPresent() && CodedEnum.class.isAssignableFrom(rawPrimaryType)) {
            //获取CodedEnum的code值
            CodedEnum[] values = (CodedEnum[]) rawPrimaryType.getEnumConstants();
            final List<String> displayValues = Arrays.stream(values).map(codedEnum -> Integer.toString(codedEnum.getCode())).collect(Collectors.toList());
            final AllowableListValues allowableListValues = new AllowableListValues(displayValues, rawPrimaryType.getTypeName());
            //固定设置为int类型
            final ResolvedType resolvedType = context.getResolver().resolve(int.class);
            context.getBuilder().allowableValues(allowableListValues).type(resolvedType);
        }
    }

    @Override
    public boolean supports(DocumentationType documentationType) {
        return true;
    }
}

ps: 这篇文章可能小众,但是原创性特别高,同类的网上资源特别少,建议收藏

自定义枚举系列

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Postman请求有签名的接口

    十毛
  • Spring Boot CLI的安装与使用

    *Spring Boot CLI的安装方式有很多种,支持sdkman安装,在MacOS上也可以使用HomeBrew。本文介绍手工安装,Windows, Mac,...

    十毛
  • Spring Boot接入配置中心Apollo

    因为application.properties会发布到所有环境,所以apollo.meta最好是直接配置在环境变量中

    十毛
  • 用Python画一个中国地图

    先来聊聊为什么做数据分析一定要用Python或R语言。编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python...

    IT派
  • 用Python画一个中国地图

    先来聊聊为什么做数据分析一定要用Python或R语言。编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python...

    顶级程序员
  • 用 4 行代码画一幅中国地图

    小小科
  • 致职场人:你或你的领导是一位优秀的管理者吗?

    黄小怪
  • 深度学习三巨头齐聚AI「名人堂」,Bengio、Lecun「补选」2020 AAAI Felllow(附完整名单)

    AAAI(Association for the Advancement of Artificial Intelligence)是国际人工智能领域最权威的学术组...

    机器之心
  • 微信电话本来了,虎口再夺食

    摘要:运营商只有期盼着微信语音通话质量没有传统语音那么好了——但问题是微信语音基于数据网络质量,运营商转向流量经营,大建4G网络提升网络质量是必须要做的。显然,...

    罗超频道
  • Magic-BLAST简单介绍

    -in 参考序列 -dbtype 数据类型:核苷酸和蛋白质可选 -parse_seqids 暂时还没搞懂这个参数的意思 -out 数据库的名称

    用户7010445

扫码关注云+社区

领取腾讯云代金券