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);
                }
            }
        }
    }
  • 相关阅读:
    SQL的四种连接(内连接,外连接)
    MySQL连表操作之一对多
    [转]Mysql连表之多对多
    Hibernate笔记二
    Hibernate框架报错:org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.mikey.hibernate.domain.Person.pid
    Hibernate框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java92)
    [转]网络编程三要素
    Hibernate笔记一
    JavaScript高级特征之面向对象笔记
    Myeclipse创建HTML文件中文显示乱码问题
  • 原文地址:https://www.cnblogs.com/cnndevelop/p/13392479.html
Copyright © 2011-2022 走看看