public SwaggerProducer createProducer()

in swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java [117:172]


  public SwaggerProducer createProducer(Object producerInstance, Class<?> schemaInterface) {
    Class<?> producerCls = targetSwaggerClass(producerInstance, schemaInterface);

    OpenAPI swagger = SwaggerGenerator.generate(producerCls);

    Map<Class<?>, ContextArgumentMapperFactory> contextFactories = SPIServiceUtils
        .getOrLoadSortedService(ProducerContextArgumentMapperFactory.class)
        .stream()
        .collect(Collectors.toMap(ProducerContextArgumentMapperFactory::getContextClass, Function.identity()));
    ResponseMapperFactories<ProducerResponseMapper> producerResponseMapperFactories =
        new ResponseMapperFactories<>(ProducerResponseMapperFactory.class);

    SwaggerOperations swaggerOperations = new SwaggerOperations(swagger);

    Map<String, Method> visibleProducerMethods = MethodUtils.findSwaggerMethodsMapOfOperationId(producerCls);

    SwaggerProducer producer = new SwaggerProducer();
    producer.setSwagger(swagger);
    producer.setProducerCls(producerCls);
    producer.setProducerInstance(producerInstance);
    for (SwaggerOperation swaggerOperation : swaggerOperations.getOperations().values()) {
      String operationId = swaggerOperation.getOperationId();
      // producer参数不一定等于swagger参数
      Method producerMethod = visibleProducerMethods.getOrDefault(operationId, null);
      if (producerMethod == null) {
        // producer未实现契约,非法
        String msg = String.format("operationId %s not exist in producer %s.",
            operationId,
            producerInstance.getClass().getName());
        throw new IllegalStateException(msg);
      }

      ProducerArgumentsMapperCreator creator = new ProducerArgumentsMapperCreator(
          Json.mapper().getSerializationConfig(),
          contextFactories,
          producerCls,
          producerMethod,
          swaggerOperation);
      ProducerArgumentsMapper argsMapper = creator.createArgumentsMapper();
      ProducerResponseMapper responseMapper = producerResponseMapperFactories.createResponseMapper(
          producerMethod.getGenericReturnType());

      SwaggerProducerOperation op = new SwaggerProducerOperation();
      op.setProducerClass(producerCls);
      op.setProducerInstance(producerInstance);
      op.setProducerMethod(producerMethod);
      op.setSwaggerOperation(swaggerOperation);
      op.setSwaggerParameterTypes(creator.getSwaggerParameterTypes());
      op.setArgumentsMapper(argsMapper);
      op.setResponseMapper(responseMapper);

      producer.addOperation(op);
    }

    return producer;
  }