2017-07-31 18 views
0

私のJava Springプロジェクトでは、新しい属性をスワッガー定義に追加しようとしています。 私がマニュアルを読み、特別 https://springfox.github.io/springfox/docs/snapshot/#pluginsSpringfox(swagger) - 動的属性を追加するには

をしかし、私は、私はこのコードをしようとしていますが、それは私が欲しいものは本当にありませんスクラッチ

から新しい属性を追加することができませんでしたています

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(); 
     }  
    } 

} 

exempleについて私は、この定義があります。

"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属性を追加できますか? この場合、私の目標はアノテーションを使わずにプログラムで属性を追加することです。

答えて

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();    
     }  
    } 
} 

を私はNPEを生成springfox理由を見つけるためにいくつかの困難を持っていたし、ルックアットソースコードの後に​​私たちはを通じてmodelRefを設定する必要があることが見つかりました:

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

他人を助ける希望:

関連する問題