2017-07-31 111 views
0

我想在我的java彈簧項目中的swagger定義中添加新的attribut。 我已閱讀文檔和專門 https://springfox.github.io/springfox/docs/snapshot/#pluginsSpringfox(swagger) - 如何添加動態attributs

但我沒能從頭

我試圖將此代碼添加新的屬性,但它不是真的是我想要的:

import java.util.HashMap; 
import java.util.Map; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.annotation.AnnotationUtils; 
import org.springframework.core.annotation.Order; 
import org.springframework.stereotype.Component; 

import com.fasterxml.classmate.ResolvedType; 
import com.fasterxml.classmate.TypeResolver; 
import com.google.common.base.Predicates; 
import fr.hop.springdatarest.demo.entity.City; 
import lombok.extern.java.Log; 
import springfox.documentation.builders.ModelPropertyBuilder; 
import springfox.documentation.builders.PathSelectors; 
import springfox.documentation.builders.RequestHandlerSelectors; 
import springfox.documentation.schema.Model; 
import springfox.documentation.schema.ModelProperty; 
import springfox.documentation.spi.DocumentationType; 
import springfox.documentation.spi.schema.ModelBuilderPlugin; 
import springfox.documentation.spi.schema.contexts.ModelContext; 
import springfox.documentation.spring.web.plugins.Docket; 
import springfox.documentation.swagger.common.SwaggerPluginSupport; 

@Log 
@Component 
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1008) 
public class SwaggerDefinitionAddin implements ModelBuilderPlugin { 

    @Autowired 
    TypeResolver resolver; 

    Map<String, ModelProperty> cityAddinMap = new HashMap<String, ModelProperty>(); 

    @Override 
    public boolean supports(DocumentationType delimiter) { 
     return DocumentationType.SWAGGER_2.equals(delimiter); 
    } 

    private Class<?> forClass(ModelContext context) { 
     return resolver.resolve(context.getType()).getErasedType(); 
    } 

    @Override 
    public void apply(ModelContext modelContext) { 

     if(forClass(modelContext) == City.class){ 

      modelContext.getBuilder().id("TEST").properties(????).build(); 
     }  
    } 

} 

對於爲例我有這樣的定義:

"definitions": { 
    "City": { 
     "type": "object", 
     "properties": { 
     "id": { 
      "type": "integer", 
      "format": "int64" 
     }, 
     "name": { 
      "type": "string" 
     }, 
     "postalCode": { 
      "type": "integer", 
      "format": "int32" 
     } 
     } 
    }, 

,我想:

"definitions": { 
    "City": { 
     "type": "object", 
     "properties": { 
     "id": { 
      "type": "integer", 
      "format": "int64" 
     }, 
     "name": { 
      "type": "string" 
     }, 
     "postalCode": { 
      "type": "integer", 
      "format": "int32" 
     }, 
     "meteo": { 
      "$ref": "#/definitions/Meteo" 
     } 
     } 
    }, 

你能幫助我在定義中添加meteo attribut嗎? 在這種情況下,我的目標是以編程方式添加attribut而不使用註釋。

回答

0

經過一番研究和測試代碼,我發現這個工作液:

@Component 
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1008) 
public class SwaggerDefinitionAddin implements ModelBuilderPlugin { 

    @Autowired 
    TypeResolver resolver; 

    @Autowired 
    TypeNameExtractor typeNameExtractor; 

    Map<String, ModelProperty> propertyAddinMap = new HashMap<String, ModelProperty>(); 



    @Override 
    public boolean supports(DocumentationType delimiter) { 
     return DocumentationType.SWAGGER_2.equals(delimiter); 
    } 

    private Class<?> forClass(ModelContext context) { 
     return resolver.resolve(context.getType()).getErasedType(); 
    } 

    @Override 
    public void apply(ModelContext modelContext) { 

     boolean cityScope = false; 
     Class<?> modelClass = forClass(modelContext); 

     // Detect if it is City modelcontext type instance 
     if(modelClass == City.class) { 
      cityScope = true; 
     } 
     // Or an Hateoas resource pointing on City instance 
     else if(modelClass.equals(Resource.class)){ 
      ResolvedType resourceResolveType = resolver.resolve(modelContext.getType()).getTypeBindings().getTypeParameters().get(0); 
      if(resourceResolveType.getErasedType().equals(City.class)) 
       cityScope = true; 
     } 

     // Add meteo definition in City definition and ResourceCity definition 
     if(cityScope){ 

      ModelPropertyBuilder builder = new ModelPropertyBuilder(); 
      ModelProperty meteoProperty = builder    
       .name("meteo") 
       .type(resolver.resolve(Meteo.class)) 
       .required(true) 
       .isHidden(false)     
       .position(0)     
       .build(); 

      meteoProperty.updateModelRef(modelRefFactory(modelContext, typeNameExtractor)); 
      propertyAddinMap.put("meteo",meteoProperty); 

      modelContext.getBuilder()   
       .name("City")    
       .properties(propertyAddinMap) 
       .build();    
     }  
    } 
} 

我遇到了一些困難,找到爲什麼springfox產生NPE和後LOOKAT源代碼,我發現,我們通過設置modelRef:

meteoProperty.updateModelRef(modelRefFactory(modelContext, typeNameExtractor)); 

希望能幫助別人:)

相關問題