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);
                }
            }
        }
    }
  • 相关阅读:
    python -第七节课之redis操作
    python 实战之商品管理数据库操作
    python 操作extel实战之写一个函数,传入一个表名,导出到excel中
    python -第六节课-异常处理和发送邮件的方法
    python -argv方法讲解
    python -第五节-python导入模块的顺序结构 和if __name__的讲解 包含两个练习
    python -第四节函数
    pycharm的设置
    第二节python基础
    第一节python基础
  • 原文地址:https://www.cnblogs.com/cnndevelop/p/13392479.html
Copyright © 2011-2022 走看看