Springfoxソース分析(12)インターフェースを巡回してApiDescriptionセットを取得する


ApiDescriptionはspringfoxが提供するインタフェース記述情報クラスで、springfoxソース分析(十)インタフェースを遍歴してModelオブジェクトを取得する中でインタフェースのタイプModel集合情報を取得したが、Model情報のほかにインタフェースにはもっと多くの情報がある.
基本情報
主に、インタフェースパス、consumes、produces、パラメータ、リクエストタイプ、説明、応答ステータスコード、時代遅れかどうか、拡張情報、パケット
我々のインタフェースは複数のリクエストタイプの存在を実行できるため、springfoxではOperationによって宣言されています.
まずApiDescriptionのソースコードを見てみましょう
public class ApiDescription {
  //    
  private final String groupName;
  //  
  private final String path;
  //  
  private final String description;
  //      
  //                 , :GET、POST、PUT、DELETE ,      1:N     
  private final List operations;
  //    
  private final Boolean hidden;
    //getter and setters....
}

コードコメントでは、私も説明しました
1つのインタフェースには、GET、POST、PUT、DELETEなど、複数のリクエストメソッドタイプが存在する可能性があるため、ここでも1:Nのマッピング関係、すなわち複数のOperationセットが存在する
操作の属性
public class Operation {
  //    
  private final HttpMethod method;
  //    
  private final String summary;
  //      
  private final String notes;
  private final ModelReference responseModel;
  //  id
  private final String uniqueId;
  private final int position;
  //tags
  private final Set tags;
  private final Set produces;
  private final Set consumes;
  private final Set protocol;
  //    
  private final boolean isHidden;
  private final Map> securityReferences;
  //  
  private final List parameters;
  //   
  private final Set responseMessages;
  //    
  private final String deprecated;
  //    
  private final List vendorExtensions;

  //setter and getter..   
}

Operationで宣言された属性には、上記のインタフェースに関する情報が含まれています.
初期化
インタフェースの紹介情報を知りました.このときspringfoxがどのように処理するかを見て、インタフェースのコンテキスト情報を最終初期化してApiDescriptionに変換します.ApiDescriptionReader.readメソッド
/***
 *   ApiDescription      
 * @param outerContext
 * @return
 */
public List read(RequestMappingContext outerContext) {
  PatternsRequestCondition patternsCondition = outerContext.getPatternsCondition();
  ApiSelector selector = outerContext.getDocumentationContext().getApiSelector();

  List apiDescriptionList = newArrayList();
  for (String path : matchingPaths(selector, patternsCondition)) {
    String methodName = outerContext.getName();
    try {
      RequestMappingContext operationContext = outerContext.copyPatternUsing(path);
	//         Operation  
      List operations = operationReader.read(operationContext);
      if (operations.size() > 0) {
        operationContext.apiDescriptionBuilder()
            .groupName(outerContext.getGroupName())
            .operations(operations)
            .pathDecorator(pluginsManager.decorator(new PathContext(outerContext, from(operations).first())))
            .path(path)
            .description(methodName)
            .hidden(false);
        ApiDescription apiDescription = operationContext.apiDescriptionBuilder().build();
        lookup.add(outerContext.key(), apiDescription);
        apiDescriptionList.add(apiDescription);
      }
    } catch (Error e) {
      String contentMsg = "Skipping process path[" + path + "], method[" + methodName + "] as it has an error.";
      log.error(contentMsg, e);
    }
  }
  return apiDescriptionList;
}

コアオペレーションはoperationReader.read操作、Operationコレクションの取得
public List read(RequestMappingContext outerContext) {

    List operations = newArrayList();
		
    Set requestMethods = outerContext.getMethodsCondition();
    Set supportedMethods = supportedMethods(requestMethods);

    //Setup response message list
    Integer currentCount = 0;
    //             
    for (RequestMethod httpRequestMethod : supportedMethods) {
      OperationContext operationContext = new OperationContext(new OperationBuilder(nameGenerator),
          httpRequestMethod,
          outerContext,
          currentCount);
		//  OperationPlugin  ,  Operation  
      Operation operation = pluginsManager.operation(operationContext);
        //  
      if (!operation.isHidden()) {
        operations.add(operation);
        currentCount++;
      }
    }
    Collections.sort(operations, outerContext.operationOrdering());

    return operations;
  }

主なロジックは次のとおりです.

  • GETを含む現在サポートされているインタフェースのタイプを取得
    POST、PUT、DELETE等
  • は、パラメータタイプ、記述、応答状態コードなどの情報
  • を含む、OperationPluginのプラグインを呼び出すことによって、Operation内の各属性に付与動作を行う.
    OperationPluginプラグインには、前述のspringfoxソース分析(5)web構成クラスPluginプラグインの使用を参照できる複数の実装タイプが含まれています.
    Operationが拡張パラメータを提供している以上、後でカスタム拡張を追加できます.
    次の章ではspringfoxのインタフェース拡張フィールドを追加する方法について説明します.