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