zoukankan      html  css  js  c++  java
  • Swagger模型字段排序问题

    由于springfox-swagger2的实现的问题,程序只能配置为按照英文字母排序。不过我们可以通过编写插件实现字段按类变量定义顺序排序。具体插件代码为

    import static springfox.documentation.schema.Annotations.findPropertyAnnotation;
    import static springfox.documentation.swagger.schema.ApiModelProperties.findApiModePropertyAnnotation;
    import java.lang.reflect.Field;
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.stereotype.Component;
    import com.fasterxml.jackson.databind.introspect.AnnotatedField;
    import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
    import com.google.common.base.Optional;
    import io.swagger.annotations.ApiModelProperty;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin;
    import springfox.documentation.spi.schema.contexts.ModelPropertyContext;
    import springfox.documentation.swagger.common.SwaggerPluginSupport;
    
    @Component
    public class CustomApiModelPropertyPositionBuilder implements ModelPropertyBuilderPlugin {
    
        private Log log = LogFactory.getLog(getClass());
    
        @Override
        public boolean supports(DocumentationType delimiter) {
            return SwaggerPluginSupport.pluginDoesApply(delimiter);
        }
    
        @Override
        public void apply(ModelPropertyContext context) {
            Optional<BeanPropertyDefinition> beanPropertyDefinitionOpt = context.getBeanPropertyDefinition();
            Optional<ApiModelProperty> annotation = Optional.absent();
            if (context.getAnnotatedElement().isPresent()) {
                annotation = annotation.or(findApiModePropertyAnnotation(context.getAnnotatedElement().get()));
            }
            if (context.getBeanPropertyDefinition().isPresent()) {
                annotation = annotation.or(findPropertyAnnotation(context.getBeanPropertyDefinition().get(), ApiModelProperty.class));
            }
            if (beanPropertyDefinitionOpt.isPresent()) {
                BeanPropertyDefinition beanPropertyDefinition = beanPropertyDefinitionOpt.get();
                if (annotation.isPresent() && annotation.get().position() != 0) {
                    return;
                }
                AnnotatedField field = beanPropertyDefinition.getField();
                Class<?> clazz = field.getDeclaringClass();
                Field[] declaredFields = clazz.getDeclaredFields();
                Field declaredField;
                try {
                    declaredField = clazz.getDeclaredField(field.getName());
                } catch (NoSuchFieldException | SecurityException e) {
                    log.error("", e);
                    return;
                }
                int indexOf = ArrayUtils.indexOf(declaredFields, declaredField);
                if (indexOf != -1) {
                    context.getBuilder().position(indexOf);
                }
            }
        }
    }
  • 相关阅读:
    微信小程序支付【前端】
    CSS主题切换
    利用Proxy写了个存储管理
    前端存储cookie操作
    canvas电子签名和播放划线
    【原创】[Ext.ux.UploadDialog] 控件使用说明及在Ext 3.x下问题解决
    【原创】分享一组VC++底层图像处理函数
    【转发】SQL Server数据库被质疑解决方案
    SVN 解决update失败出现乱码提示或工作副本已经锁定
    Qt 外部子模块的3种使用方法,以QtXlsx为例
  • 原文地址:https://www.cnblogs.com/cnndevelop/p/13392479.html
Copyright © 2011-2022 走看看