You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2023/08/16 01:37:33 UTC

[servicecomb-java-chassis] branch master updated (39490425a -> c30191c05)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


    from 39490425a Bump org.java-websocket:Java-WebSocket from 1.5.3 to 1.5.4 (#3868)
     new 792d7c76b [SCB-2803]refactoring swagger generator to support many codec implementations
     new 6da89ef8f [SCB-2803]refactoring swagger generator jaxrs to support many codec implementations
     new 32e6157c3 [SCB-2803]fix swagger generator jaxrs to support many codec implementations
     new 87fc24bc4 [SCB-2803]refactor jaxrs parameter processor name
     new d4567e69e [SCB-2803]refactor springmvc parameter processors
     new 8682c9dfc [SCB-2803]remove old api and add replacement
     new 51e010cc0 [SCB-2803]fix problems in spring mvc test case
     new 59b9d4a4f [SCB-2803]fix problems in spring mvc test case
     new b5d462553 [SCB-2803]fix problems in demo pojo test case
     new d3ab52dca [SCB-2803]response support different media types
     new 697af915a [SCB-2803]fix problems in all test cases
     new c30191c05 [SCB-2803]fix checkstyle

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../converter/SwaggerToProtoGenerator.java         |  39 +--
 .../internal/converter/model/ProtoSchema.java      |   6 +
 .../src/test/resources/ProtoSchema.proto           |  21 +-
 .../rest/codec/param/BodyProcessorCreator.java     |   3 +-
 .../rest/filter/inner/RestServerCodecFilter.java   |   2 +-
 .../rest/definition/TestRestOperationMeta.java     |  52 ++--
 .../edge/consumer/EdgeServiceGovernanceTest.java   |   4 +-
 .../demo/jaxrs/client/TestFileUploadSchema.java    |   7 +-
 .../demo/jaxrs/server/CodeFirstJaxrs.java          |   9 -
 .../resources/microservices/jaxrs/compute.yaml     |  22 +-
 .../schemas/CodeFirstSpringmvcForSchema.yaml       |  10 +-
 .../provider/pojo/definition/PojoConsumerMeta.java |   8 -
 .../apache/servicecomb/swagger/SwaggerUtils.java   |   5 +-
 .../swagger/generator/OperationGenerator.java      |  17 +-
 .../swagger/generator/OperationPostProcessor.java  |  28 --
 ...ssor.java => ParameterAnnotationProcessor.java} |  13 +-
 .../swagger/generator/ParameterGenerator.java      | 193 +++++++++-----
 .../swagger/generator/ParameterProcessor.java      |  62 -----
 ...nProcessor.java => ParameterTypeProcessor.java} |  10 +-
 .../swagger/generator/SwaggerConst.java            |   2 +
 .../swagger/generator/SwaggerGenerator.java        |   3 +
 .../swagger/generator/SwaggerGeneratorUtils.java   | 115 +++-----
 ...va => SwaggerParameterAnnotationProcessor.java} |  13 +-
 .../generator/core/AbstractOperationGenerator.java | 278 +++++++------------
 .../generator/core/AbstractSwaggerGenerator.java   |  16 +-
 .../generator/core/OperationGeneratorContext.java  |  88 ++++++
 .../generator/core/ParameterGeneratorContext.java  | 166 ++++++++++++
 .../generator/core/SwaggerGeneratorContext.java    |  86 ++++++
 .../annotation/ApiResponseMethodProcessor.java     |  46 +++-
 .../annotation/ApiResponsesClassProcessor.java     |  43 ---
 .../annotation/ApiResponsesMethodProcessor.java    |  45 +++-
 .../OperationMethodAnnotationProcessor.java        |  61 ++++-
 .../parameter/AbstractParameterProcessor.java      |  24 --
 .../processor/parameter/EnumPostProcessor.java     |  93 -------
 .../processor/parameter/JsonViewProcessor.java     |  72 -----
 .../ParameterParameterAnnotationProcessor.java     |  73 +++++
 .../parameter/ParameterParameterProcessor.java     |  81 ------
 ...r.java => PartArrayParameterTypeProcessor.java} |  19 +-
 .../processor/parameter/PartArrayProcessor.java    |  84 ------
 ...or.java => PartListParameterTypeProcessor.java} |  13 +-
 .../parameter/PartParameterTypeProcessor.java      |  64 +++++
 .../core/processor/parameter/PartProcessor.java    |  85 ------
 .../parameter/RawJsonRequestBodyProcessor.java     |  48 ++--
 .../RequestBodyParameterAnnotationProcessor.java}  |  25 +-
 .../parameter/RequestBodyParameterProcessor.java   |  90 -------
 .../generator/pojo/PojoOperationGenerator.java     | 145 +++-------
 .../generator/pojo/PojoSwaggerGenerator.java       |  10 +
 ...comb.swagger.generator.ClassAnnotationProcessor |   1 -
 ...swagger.generator.ParameterAnnotationProcessor} |   4 +-
 ...ervicecomb.swagger.generator.ParameterProcessor |  24 --
 ...ecomb.swagger.generator.ParameterTypeProcessor} |   5 +-
 .../swagger/generator/core/TestApiOperation.java   |   9 +-
 .../swagger/generator/core/TestApiResponse.java    |  16 +-
 .../generator/core/TestOperationGenerator.java     |  23 +-
 .../core/{TestPojoExample.java => TestPojo.java}   |  18 +-
 .../OperationMethodAnnotationProcessorTest.java    |  34 +--
 .../swagger/generator/core/schema/Schema.java      |  24 +-
 .../resources/schemas/ParameterAnnotation.yaml}    |  49 ++--
 .../src/test/resources/schemas/Schema.yaml         | 295 +++++++++++++++++----
 .../src/test/resources/schemas/pojoExample1.yaml   |  24 ++
 .../generator/jaxrs/JaxrsOperationGenerator.java   |  10 -
 ....java => ConsumesClassAnnotationProcessor.java} |  17 +-
 ...java => ConsumesMethodAnnotationProcessor.java} |  10 +-
 .../annotation/CookieParamAnnotationProcessor.java |  67 -----
 .../CookieParamParameterAnnotationProcessor.java}  |  36 +--
 ...r.java => DeleteMethodAnnotationProcessor.java} |   2 +-
 .../annotation/FormParamAnnotationProcessor.java   |  98 -------
 .../FormParamParameterAnnotationProcessor.java}    |  35 +--
 ...ssor.java => GetMethodAnnotationProcessor.java} |   9 +-
 .../annotation/HeaderParamAnnotationProcessor.java |  68 -----
 .../HeaderParamParameterAnnotationProcessor.java}  |  36 +--
 ...sor.java => JaxrsClassAnnotationProcessor.java} |   9 +-
 ...or.java => JaxrsMethodAnnotationProcessor.java} |   9 +-
 ...java => JaxrsParameterAnnotationProcessor.java} |   8 +-
 ...or.java => PatchMethodAnnotationProcessor.java} |   2 +-
 .../annotation/PathClassAnnotationProcessor.java   |   7 +-
 .../annotation/PathMethodAnnotationProcessor.java  |   7 +-
 .../annotation/PathParamAnnotationProcessor.java   |  67 -----
 .../PathParamParameterAnnotationProcessor.java}    |  36 +--
 ...sor.java => PostMethodAnnotationProcessor.java} |   2 +-
 ....java => ProducesClassAnnotationProcessor.java} |  17 +-
 ...java => ProducesMethodAnnotationProcessor.java} |  10 +-
 ...ssor.java => PutMethodAnnotationProcessor.java} |   2 +-
 .../annotation/QueryParamAnnotationProcessor.java  |  67 -----
 .../QueryParamParameterAnnotationProcessor.java}   |  35 +--
 ...comb.swagger.generator.ClassAnnotationProcessor |   4 +-
 ...omb.swagger.generator.MethodAnnotationProcessor |  14 +-
 ...swagger.generator.ParameterAnnotationProcessor} |  10 +-
 .../swagger/generator/jaxrs/ClassAnnotation.java   |  75 ++++++
 .../servicecomb/swagger/generator/jaxrs/Echo.java  |   8 +-
 .../generator/jaxrs/FullSwaggerService.java        |  20 +-
 .../generator/jaxrs/TestClassAnnotation.java}      |  39 +--
 .../swagger/generator/jaxrs/TestJaxrs.java         |  26 +-
 .../test/resources/schemas/ClassAnnotation.yaml}   | 104 ++++----
 .../test/resources/schemas/FullSwaggerService.yaml |  38 ++-
 .../src/test/resources/schemas/echo.yaml           | 166 +++++++++---
 .../src/test/resources/pageSchema.yaml             |  12 +
 .../springmvc/SpringmvcOperationGenerator.java     |  17 +-
 .../annotation/CookieValueAnnotationProcessor.java |  51 ++--
 .../PathVariableAnnotationProcessor.java           |  45 ++--
 .../RequestAttributeAnnotationProcessor.java       |  61 ++---
 .../annotation/RequestBodyAnnotationProcessor.java |  34 +--
 .../RequestHeaderAnnotationProcessor.java          |  52 ++--
 .../annotation/RequestParamParameterProcessor.java |  52 ++--
 .../annotation/RequestPartAnnotationProcessor.java |  77 ++----
 ...=> SpringmvcParameterAnnotationsProcessor.java} |  11 +-
 .../parameter/MultipartFileArrayProcessor.java     |  13 +-
 .../parameter/MultipartFileListProcessor.java      |  11 +-
 .../parameter/MultipartFileTypeProcessor.java      |  13 +-
 ...swagger.generator.ParameterAnnotationProcessor} |   5 +-
 ...cecomb.swagger.generator.ParameterTypeProcessor |   4 +-
 .../swagger/generator/springmvc/Echo.java          |  15 +-
 .../springmvc/MethodMixupAnnotations.java          |   8 +-
 .../swagger/generator/springmvc/TestSpringmvc.java |  22 +-
 .../RequestPartAnnotationProcessorTest.java        |   4 +
 .../resources/schemas/DefaultParameterSchema.yaml  |  36 +++
 .../src/test/resources/schemas/DemoRest.yaml       |   6 +-
 .../src/test/resources/schemas/echo.yaml           |  79 +++++-
 .../test/resources/schemas/mixupAnnotations.yaml   | 176 +++++++++++-
 .../src/test/resources/schemas/responseEntity.yaml |  60 +++++
 .../producer/ProducerArgumentsMapperCreator.java   |   2 +-
 .../swagger/invocation/response/ResponsesMeta.java |  14 +-
 .../invocation/response/TestResponsesMeta.java     |   2 +-
 .../TestConsumerResponseMapperFactorys.java        |   6 +-
 .../TestProducerResponseMapperFactorys.java        |   4 +-
 .../response/TestJaxrsConsumerResponseMapper.java  |   3 +-
 126 files changed, 2579 insertions(+), 2411 deletions(-)
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationPostProcessor.java
 copy swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/{MethodAnnotationProcessor.java => ParameterAnnotationProcessor.java} (70%)
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterProcessor.java
 copy swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/{MethodAnnotationProcessor.java => ParameterTypeProcessor.java} (82%)
 copy swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/{MethodAnnotationProcessor.java => SwaggerParameterAnnotationProcessor.java} (77%)
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesClassProcessor.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/JsonViewProcessor.java
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterProcessor.java
 copy swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/{PartListProcessor.java => PartArrayParameterTypeProcessor.java} (58%)
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayProcessor.java
 rename swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/{PartListProcessor.java => PartListParameterTypeProcessor.java} (74%)
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartProcessor.java
 copy swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/{annotation/RequestBodyMethodAnnotationProcessor.java => parameter/RequestBodyParameterAnnotationProcessor.java} (60%)
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterProcessor.java
 copy swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/{org.apache.servicecomb.swagger.generator.OperationPostProcessor => org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor} (78%)
 delete mode 100644 swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
 rename swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/{org.apache.servicecomb.swagger.generator.OperationPostProcessor => org.apache.servicecomb.swagger.generator.ParameterTypeProcessor} (79%)
 copy swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/{TestPojoExample.java => TestPojo.java} (64%)
 copy swagger/swagger-generator/{generator-jaxrs/src/test/resources/schemas/dynamicStatusEnum.yaml => generator-core/src/test/resources/schemas/ParameterAnnotation.yaml} (64%)
 copy swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{PathClassAnnotationProcessor.java => ConsumesClassAnnotationProcessor.java} (70%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{ConsumesAnnotationProcessor.java => ConsumesMethodAnnotationProcessor.java} (78%)
 delete mode 100644 swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
 copy swagger/swagger-generator/{generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java => generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java} (57%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{DeleteAnnotationProcessor.java => DeleteMethodAnnotationProcessor.java} (92%)
 delete mode 100644 swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
 copy swagger/swagger-generator/{generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java => generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java} (57%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{GetAnnotationProcessor.java => GetMethodAnnotationProcessor.java} (90%)
 delete mode 100644 swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
 copy swagger/swagger-generator/{generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java => generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java} (56%)
 copy swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{AbstractJaxrsParameterProcessor.java => JaxrsClassAnnotationProcessor.java} (77%)
 copy swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{AbstractJaxrsParameterProcessor.java => JaxrsMethodAnnotationProcessor.java} (77%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{AbstractJaxrsParameterProcessor.java => JaxrsParameterAnnotationProcessor.java} (76%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{PatchAnnotationProcessor.java => PatchMethodAnnotationProcessor.java} (92%)
 delete mode 100644 swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
 copy swagger/swagger-generator/{generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java => generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java} (55%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{PostAnnotationProcessor.java => PostMethodAnnotationProcessor.java} (92%)
 copy swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{PathClassAnnotationProcessor.java => ProducesClassAnnotationProcessor.java} (70%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{ProducesAnnotationProcessor.java => ProducesMethodAnnotationProcessor.java} (78%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/{PutAnnotationProcessor.java => PutMethodAnnotationProcessor.java} (92%)
 delete mode 100644 swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
 copy swagger/swagger-generator/{generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java => generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java} (57%)
 rename swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/{org.apache.servicecomb.swagger.generator.ParameterProcessor => org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor} (83%)
 create mode 100644 swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/ClassAnnotation.java
 copy swagger/swagger-generator/{generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessorTest.java => generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java} (50%)
 copy swagger/swagger-generator/{generator-springmvc/src/test/resources/schemas/responseEntity.yaml => generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml} (57%)
 rename swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/{AbstractSpringmvcParameterProcessor.java => SpringmvcParameterAnnotationsProcessor.java} (76%)
 rename swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/{org.apache.servicecomb.swagger.generator.ParameterProcessor => org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor} (81%)
 copy common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta => swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor (72%)


[servicecomb-java-chassis] 06/12: [SCB-2803]remove old api and add replacement

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 8682c9dfcacd4d7bebabcfb329f44b6b04f3b72f
Author: liubao <bi...@qq.com>
AuthorDate: Fri Aug 11 15:57:47 2023 +0800

    [SCB-2803]remove old api and add replacement
---
 .../generator/ParameterAnnotationProcessor.java    |  7 ++
 .../swagger/generator/ParameterGenerator.java      | 44 ++++++-----
 .../swagger/generator/ParameterProcessor.java      | 62 ---------------
 .../swagger/generator/SwaggerGeneratorUtils.java   | 89 ++++------------------
 .../generator/core/AbstractOperationGenerator.java |  5 +-
 .../generator/core/ParameterGeneratorContext.java  |  4 +
 .../ParameterParameterAnnotationProcessor.java     | 13 +++-
 .../parameter/RawJsonRequestBodyProcessor.java     | 16 +++-
 .../RequestBodyParameterAnnotationProcessor.java   |  7 ++
 .../generator/pojo/PojoOperationGenerator.java     | 13 ++--
 .../CookieParamParameterAnnotationProcessor.java   | 12 ++-
 .../FormParamParameterAnnotationProcessor.java     | 12 ++-
 .../HeaderParamParameterAnnotationProcessor.java   | 12 ++-
 .../PathParamParameterAnnotationProcessor.java     | 12 ++-
 .../QueryParamParameterAnnotationProcessor.java    | 12 ++-
 .../annotation/CookieValueAnnotationProcessor.java | 16 +++-
 .../PathVariableAnnotationProcessor.java           | 16 +++-
 .../RequestAttributeAnnotationProcessor.java       | 16 +++-
 .../annotation/RequestBodyAnnotationProcessor.java |  4 +
 .../RequestHeaderAnnotationProcessor.java          | 16 +++-
 .../annotation/RequestParamParameterProcessor.java | 16 +++-
 .../annotation/RequestPartAnnotationProcessor.java | 16 +++-
 22 files changed, 213 insertions(+), 207 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
index e1a61098e..efba1bf57 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
@@ -21,6 +21,13 @@ import java.lang.reflect.Type;
 public interface ParameterAnnotationProcessor<ANNOTATION> {
   Type getProcessType();
 
+  /**
+   * Get parameter name from annotation. This method is used in both
+   * swagger generation and invocation. In invocation, need to find the
+   * swagger parameter name of the method parameter.
+   */
+  String getParameterName(ANNOTATION annotation);
+
   void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, ANNOTATION annotation);
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index c085b8751..656900e0c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -17,8 +17,6 @@
 package org.apache.servicecomb.swagger.generator;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Executable;
-import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -28,11 +26,11 @@ import org.apache.servicecomb.swagger.generator.core.ParameterGeneratorContext;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.MediaType;
 import io.swagger.v3.oas.models.media.ObjectSchema;
+import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.oas.models.parameters.CookieParameter;
 import io.swagger.v3.oas.models.parameters.HeaderParameter;
 import io.swagger.v3.oas.models.parameters.Parameter;
@@ -47,51 +45,55 @@ public class ParameterGenerator {
 
   private final ParameterGeneratorContext parameterGeneratorContext;
 
-  public ParameterGenerator(OperationGenerator operationGenerator, String parameterName) {
+  /**
+   * Used for pojo wrap parameter, while parameter type is null.
+   */
+  public ParameterGenerator(OperationGenerator operationGenerator, String parameterName, Schema<?> schema) {
     this.operationGenerator = operationGenerator;
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
+    this.parameterGeneratorContext.setSchema(schema);
     this.annotations = Collections.emptyList();
   }
 
-  public ParameterGenerator(OperationGenerator operationGenerator, Executable executable,
+  /**
+   * Used for @BeanParam like parameters, while extract JavaType of the bean parameter type.
+   */
+  public ParameterGenerator(OperationGenerator operationGenerator,
       Map<String, List<Annotation>> methodAnnotationMap,
-      String defaultName,
-      Annotation[] parameterAnnotations, Type genericType) {
+      String parameterName,
+      Annotation[] parameterAnnotations, JavaType genericType) {
     this.operationGenerator = operationGenerator;
-    String parameterName = SwaggerGeneratorUtils.collectParameterName(executable, parameterAnnotations,
-        defaultName);
     this.annotations = SwaggerGeneratorUtils.collectParameterAnnotations(parameterAnnotations,
         methodAnnotationMap,
         parameterName);
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
-    this.parameterGeneratorContext.setParameterType(TypeFactory.defaultInstance()
-        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, genericType)));
-    this.parameterGeneratorContext.setHttpParameterType(
-        SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType));
+    this.parameterGeneratorContext.setParameterType(genericType);
   }
 
-  public ParameterGenerator(OperationGenerator operationGenerator, Executable executable,
+  /**
+   * Used for normal method parameter initialization, while extract JavaType from method parameter.
+   */
+  public ParameterGenerator(OperationGenerator operationGenerator,
       Map<String, List<Annotation>> methodAnnotationMap,
-      java.lang.reflect.Parameter methodParameter, Type genericType) {
-    this(operationGenerator, executable,
+      java.lang.reflect.Parameter methodParameter, JavaType genericType) {
+    this(operationGenerator,
         methodAnnotationMap,
         methodParameter.isNamePresent() ? methodParameter.getName() : null,
         methodParameter.getAnnotations(),
         genericType);
   }
 
+  /**
+   * Used for annotation defined parameter, while initial parameter type is null
+   * and will extract JavaType annotation processors.
+   */
   public ParameterGenerator(OperationGenerator operationGenerator, String parameterName, List<Annotation> annotations) {
     this.operationGenerator = operationGenerator;
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
     this.annotations = annotations;
-    this.parameterGeneratorContext.setParameterType(TypeFactory.defaultInstance()
-        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, null)));
-    this.parameterGeneratorContext.setHttpParameterType(
-        SwaggerGeneratorUtils.collectHttpParameterType(annotations,
-            this.parameterGeneratorContext.getParameterType()));
   }
 
   public ParameterGeneratorContext getParameterGeneratorContext() {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterProcessor.java
deleted file mode 100644
index 69b0d41f1..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterProcessor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator;
-
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-public interface ParameterProcessor<ANNOTATION> {
-  Type getProcessType();
-
-  default JavaType getProcessJavaType() {
-    return TypeFactory.defaultInstance().constructType(getProcessType());
-  }
-
-  String getParameterName(ANNOTATION parameterAnnotation);
-
-  default Type getGenericType(ANNOTATION parameterAnnotation) {
-    return null;
-  }
-
-  HttpParameterType getHttpParameterType(ANNOTATION parameterAnnotation);
-
-  void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      ANNOTATION annotation);
-
-  default void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, Type type,
-      ANNOTATION annotation) {
-    fillParameter(swagger, operation, parameter, TypeFactory.defaultInstance().constructType(type), annotation);
-  }
-
-  void fillRequestBody(OpenAPI swagger, Operation operation,
-      RequestBody parameter, String parameterName, JavaType type, ANNOTATION annotation);
-
-  default void fillRequestBody(OpenAPI swagger, Operation operation,
-      RequestBody parameter, String parameterName, Type type, ANNOTATION annotation) {
-    fillRequestBody(swagger, operation, parameter, parameterName,
-        TypeFactory.defaultInstance().constructType(type), annotation);
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
index 1b71d9dcc..c8b0498de 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
@@ -31,7 +31,6 @@ import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.processor.response.DefaultResponseTypeProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,6 +42,7 @@ import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.v3.core.util.Json;
 
+@SuppressWarnings("rawtypes")
 public final class SwaggerGeneratorUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerGeneratorUtils.class);
 
@@ -57,8 +57,6 @@ public final class SwaggerGeneratorUtils {
 
   private static final Map<Type, MethodAnnotationProcessor<?>> methodAnnotationProcessors = new HashMap<>();
 
-  private static final Map<JavaType, ParameterProcessor<?>> parameterProcessors = new HashMap<>();
-
   private static final Map<Type, ResponseTypeProcessor> responseTypeProcessors = new HashMap<>();
 
   private static final DefaultResponseTypeProcessor defaultResponseTypeProcessor = new DefaultResponseTypeProcessor();
@@ -87,14 +85,6 @@ public final class SwaggerGeneratorUtils {
       }
     }
 
-    for (ParameterProcessor<?> processor : SPIServiceUtils.getOrLoadSortedService(ParameterProcessor.class)) {
-      JavaType javaType = processor.getProcessJavaType();
-      if (parameterProcessors.putIfAbsent(javaType, processor) != null) {
-        LOGGER.info("ignore duplicated ParameterProcessor, type={}, processor={}.",
-            javaType.toCanonical(), processor.getClass().getName());
-      }
-    }
-
     for (ResponseTypeProcessor processor : SPIServiceUtils.getOrLoadSortedService(ResponseTypeProcessor.class)) {
       if (responseTypeProcessors.putIfAbsent(processor.getProcessType(), processor) != null) {
         LOGGER.info("ignore duplicated ResponseTypeProcessor, type={}, processor={}.",
@@ -119,12 +109,6 @@ public final class SwaggerGeneratorUtils {
     return (MethodAnnotationProcessor<ANNOTATION>) methodAnnotationProcessors.get(type);
   }
 
-  @SuppressWarnings("unchecked")
-  public static <ANNOTATION> ParameterProcessor<ANNOTATION> findParameterProcessors(
-      Type type) {
-    return findParameterProcessors(TypeFactory.defaultInstance().constructType(type));
-  }
-
   @SuppressWarnings("unchecked")
   public static ParameterAnnotationProcessor<Annotation> findParameterAnnotationProcessor(Type type) {
     for (ParameterAnnotationProcessor<Annotation> processor : parameterAnnotationProcessors) {
@@ -135,7 +119,6 @@ public final class SwaggerGeneratorUtils {
     return null;
   }
 
-  @SuppressWarnings("unchecked")
   public static ParameterTypeProcessor findParameterTypeProcessor(Type type) {
     for (ParameterTypeProcessor processor : parameterTypeProcessors) {
       if (processor.getProcessType() == type) {
@@ -145,12 +128,6 @@ public final class SwaggerGeneratorUtils {
     return null;
   }
 
-  @SuppressWarnings("unchecked")
-  public static <ANNOTATION> ParameterProcessor<ANNOTATION> findParameterProcessors(
-      JavaType type) {
-    return (ParameterProcessor<ANNOTATION>) parameterProcessors.get(type);
-  }
-
   public static ResponseTypeProcessor findResponseTypeProcessor(Type type) {
     ResponseTypeProcessor processor = responseTypeProcessors.get(type);
     if (processor != null) {
@@ -197,7 +174,8 @@ public final class SwaggerGeneratorUtils {
     //   it's ambiguous to use different name in different annotation
     //   so we only read the first available name
     for (Annotation annotation : annotations) {
-      ParameterProcessor<Annotation> processor = findParameterProcessors(annotation.annotationType());
+      ParameterAnnotationProcessor<Annotation> processor = findParameterAnnotationProcessor(
+          annotation.annotationType());
       if (processor == null) {
         continue;
       }
@@ -214,37 +192,21 @@ public final class SwaggerGeneratorUtils {
       return defaultName;
     }
 
-    String msg = String.format("parameter name is not present, method=%s:%s\n"
-            + "solution:\n"
-            + "  change pom.xml, add compiler argument: -parameters, for example:\n"
-            + "    <plugin>\n"
-            + "      <groupId>org.apache.maven.plugins</groupId>\n"
-            + "      <artifactId>maven-compiler-plugin</artifactId>\n"
-            + "      <configuration>\n"
-            + "        <compilerArgument>-parameters</compilerArgument>\n"
-            + "      </configuration>\n"
-            + "    </plugin>",
+    String msg = String.format("""
+            parameter name is not present, method=%s:%s
+            solution:
+              change pom.xml, add compiler argument: -parameters, for example:
+                <plugin>
+                  <groupId>org.apache.maven.plugins</groupId>
+                  <artifactId>maven-compiler-plugin</artifactId>
+                  <configuration>
+                    <compilerArgument>-parameters</compilerArgument>
+                  </configuration>
+                </plugin>""",
         executable.getDeclaringClass().getName(), executable.getName());
     throw new IllegalStateException(msg);
   }
 
-  public static Type collectGenericType(List<Annotation> annotations, Type defaultType) {
-    Type genericType = null;
-    for (Annotation annotation : annotations) {
-      ParameterProcessor<Annotation> processor = findParameterProcessors(annotation.annotationType());
-      if (processor == null) {
-        continue;
-      }
-
-      Type type = processor.getGenericType(annotation);
-      if (type != null) {
-        genericType = type;
-      }
-    }
-
-    return genericType != null ? genericType : defaultType;
-  }
-
   public static List<Annotation> collectParameterAnnotations(Annotation[] parameterAnnotations,
       Map<String, List<Annotation>> methodAnnotationMap, String parameterName) {
     List<Annotation> methodAnnotations = methodAnnotationMap.remove(parameterName);
@@ -258,27 +220,4 @@ public final class SwaggerGeneratorUtils {
 
     return annotations;
   }
-
-  public static HttpParameterType collectHttpParameterType(List<Annotation> annotations, Type genericType) {
-    // use the last available type
-    for (int idx = annotations.size() - 1; idx >= 0; idx--) {
-      Annotation annotation = annotations.get(idx);
-      HttpParameterType httpParameterType = collectHttpParameterType(annotation, annotation.annotationType());
-      if (httpParameterType != null) {
-        return httpParameterType;
-      }
-    }
-
-    // try by parameter type
-    return collectHttpParameterType((Annotation) null, genericType);
-  }
-
-  private static HttpParameterType collectHttpParameterType(Annotation parameterAnnotation, Type type) {
-    ParameterProcessor<Annotation> processor = findParameterProcessors(type);
-    if (processor == null) {
-      return null;
-    }
-
-    return processor.getHttpParameterType(parameterAnnotation);
-  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index f78812f6d..4d89a1d38 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -221,7 +221,8 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
           .resolveType(methodParameter.getParameterizedType())
           .getType();
       ParameterGenerator parameterGenerator = new ParameterGenerator(
-          this, method, methodAnnotationMap, methodParameter, genericType);
+          this, methodAnnotationMap, methodParameter,
+          TypeFactory.defaultInstance().constructType(genericType));
       validateParameter(parameterGenerator.getGenericType());
       if (isContextParameter(parameterGenerator.getGenericType())) {
         continue;
@@ -253,7 +254,7 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
       }
 
       Annotation[] annotations = collectAnnotations(propertyDefinition);
-      ParameterGenerator propertyParameterGenerator = new ParameterGenerator(this, method,
+      ParameterGenerator propertyParameterGenerator = new ParameterGenerator(this,
           methodAnnotationMap,
           propertyDefinition.getName(),
           annotations,
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
index fc8e09481..99b1eba22 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
@@ -27,6 +27,10 @@ import io.swagger.v3.oas.models.media.Schema;
 import jakarta.ws.rs.core.MediaType;
 
 public class ParameterGeneratorContext extends OperationGeneratorContext {
+  /**
+   * Parameter type. Maybe override by annotations. And for pojo wrapped parameter,
+   * this is null.
+   */
   private JavaType parameterType;
 
   private String parameterName;
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
index c4b549095..12849da4e 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
@@ -25,6 +25,7 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import com.fasterxml.jackson.databind.type.TypeFactory;
 
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.enums.Explode;
 import io.swagger.v3.oas.annotations.enums.ParameterIn;
 
@@ -35,6 +36,14 @@ public class ParameterParameterAnnotationProcessor
     return io.swagger.v3.oas.annotations.Parameter.class;
   }
 
+  @Override
+  public String getParameterName(Parameter annotation) {
+    if (StringUtils.isNotEmpty(annotation.name())) {
+      return annotation.name();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, io.swagger.v3.oas.annotations.Parameter annotation) {
@@ -45,8 +54,8 @@ public class ParameterParameterAnnotationProcessor
           .setParameterType(TypeFactory.defaultInstance().constructType(annotation.schema().implementation()));
     }
 
-    if (StringUtils.isNotEmpty(annotation.name())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.name());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
 
     if (annotation.in() != null && annotation.in() != ParameterIn.DEFAULT) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
index 0900ffe96..8eb8c6bdc 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
@@ -32,15 +32,23 @@ public class RawJsonRequestBodyProcessor extends
     return RawJsonRequestBody.class;
   }
 
+  @Override
+  public String getParameterName(RawJsonRequestBody annotation) {
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      return annotation.value();
+    } else if (StringUtils.isNotEmpty(annotation.name())) {
+      return annotation.name();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, RawJsonRequestBody annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
 
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
-    } else if (StringUtils.isNotEmpty(annotation.name())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.name());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
 
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
index 5394bf3c6..06ab22cae 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
@@ -23,6 +23,8 @@ import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+
 public class RequestBodyParameterAnnotationProcessor extends
     SwaggerParameterAnnotationProcessor<io.swagger.v3.oas.annotations.parameters.RequestBody> {
   @Override
@@ -30,6 +32,11 @@ public class RequestBodyParameterAnnotationProcessor extends
     return io.swagger.v3.oas.annotations.parameters.RequestBody.class;
   }
 
+  @Override
+  public String getParameterName(RequestBody requestBody) {
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, io.swagger.v3.oas.annotations.parameters.RequestBody annotation) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
index d2d4cf1e0..c36f56cc6 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
@@ -32,6 +32,7 @@ import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.google.common.reflect.TypeToken;
 
 import io.swagger.v3.oas.models.Components;
@@ -52,7 +53,8 @@ public class PojoOperationGenerator extends AbstractOperationGenerator {
           .resolveType(methodParameter.getParameterizedType())
           .getType();
       ParameterGenerator parameterGenerator = new ParameterGenerator(
-          this, method, Collections.emptyMap(), methodParameter, type);
+          this, Collections.emptyMap(), methodParameter,
+          TypeFactory.defaultInstance().constructType(type));
       validateParameter(parameterGenerator.getGenericType());
       if (isContextParameter(parameterGenerator.getGenericType())) {
         continue;
@@ -88,15 +90,12 @@ public class PojoOperationGenerator extends AbstractOperationGenerator {
           SwaggerUtils.resolveTypeSchemas(swagger, parameterGenerator.getGenericType()));
     }
 
-    ParameterGenerator newParameterGenerator = new ParameterGenerator(this, simpleRef);
-    newParameterGenerator.getParameterGeneratorContext().setParameterName(simpleRef);
-    newParameterGenerator.setHttpParameterType(HttpParameterType.BODY);
-    parameterGenerators.add(newParameterGenerator);
-
     swagger.getComponents().addSchemas(simpleRef, bodyModel);
     Schema<?> bodyModelNew = new Schema<>();
     bodyModelNew.set$ref(Components.COMPONENTS_SCHEMAS_REF + simpleRef);
-    newParameterGenerator.getParameterGeneratorContext().setSchema(bodyModelNew);
+    ParameterGenerator newParameterGenerator = new ParameterGenerator(this, simpleRef, bodyModelNew);
+    newParameterGenerator.setHttpParameterType(HttpParameterType.BODY);
+    parameterGenerators.add(newParameterGenerator);
   }
 
   @Override
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
index 021fc2b4f..e19875109 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
@@ -34,12 +34,20 @@ public class CookieParamParameterAnnotationProcessor extends
     return CookieParam.class;
   }
 
+  @Override
+  public String getParameterName(CookieParam annotation) {
+    if (StringUtils.isEmpty(annotation.value())) {
+      return null;
+    }
+    return annotation.value();
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, CookieParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
index c005e19ab..42f5bab47 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
@@ -33,12 +33,20 @@ public class FormParamParameterAnnotationProcessor extends JaxrsParameterAnnotat
     return FormParam.class;
   }
 
+  @Override
+  public String getParameterName(FormParam annotation) {
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      return annotation.value();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, FormParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.FORM);
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
index 4e4f890b0..41e3b68c8 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
@@ -34,12 +34,20 @@ public class HeaderParamParameterAnnotationProcessor extends
     return HeaderParam.class;
   }
 
+  @Override
+  public String getParameterName(HeaderParam annotation) {
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      return annotation.value();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, HeaderParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.HEADER);
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
index e761f1387..9102ee321 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
@@ -33,13 +33,21 @@ public class PathParamParameterAnnotationProcessor extends JaxrsParameterAnnotat
     return PathParam.class;
   }
 
+  @Override
+  public String getParameterName(PathParam annotation) {
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      return annotation.value();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, PathParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
     parameterGenerator.getParameterGeneratorContext().setRequired(true);
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
index ce03c6814..9f5cb7fc3 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
@@ -33,12 +33,20 @@ public class QueryParamParameterAnnotationProcessor extends JaxrsParameterAnnota
     return QueryParam.class;
   }
 
+  @Override
+  public String getParameterName(QueryParam annotation) {
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      return annotation.value();
+    }
+    return null;
+  }
+
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, QueryParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.QUERY);
-    if (StringUtils.isNotEmpty(annotation.value())) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
index b2d04cdd0..d9b9df3f6 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
@@ -35,15 +35,23 @@ public class CookieValueAnnotationProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, CookieValue annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+  public String getParameterName(CookieValue annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, CookieValue annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
     if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
index 2c4b20313..ac89b8db8 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
@@ -34,15 +34,23 @@ public class PathVariableAnnotationProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, PathVariable annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
+  public String getParameterName(PathVariable annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, PathVariable annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
index 646d11283..910306990 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
@@ -41,15 +41,23 @@ public class RequestAttributeAnnotationProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, RequestAttribute annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+  public String getParameterName(RequestAttribute annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestAttribute annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
index 700b150b6..e7e755b3a 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
@@ -32,6 +32,10 @@ public class RequestBodyAnnotationProcessor extends
     return RequestBody.class;
   }
 
+  @Override
+  public String getParameterName(RequestBody annotation) {
+    return null;
+  }
 
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
index 13ef18537..5d7b14841 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
@@ -35,15 +35,23 @@ public class RequestHeaderAnnotationProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, RequestHeader annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+  public String getParameterName(RequestHeader annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestHeader annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
     if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
index afb7e80de..daeb63efd 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
@@ -42,15 +42,23 @@ public class RequestParamParameterProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, RequestParam annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+  public String getParameterName(RequestParam annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
     if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
index f99cfeb66..b78f374e1 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
@@ -34,15 +34,23 @@ public class RequestPartAnnotationProcessor extends
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      ParameterGenerator parameterGenerator, RequestPart annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+  public String getParameterName(RequestPart annotation) {
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
     if (StringUtils.isNotEmpty(value)) {
-      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
+      return value;
+    }
+    return null;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestPart annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(getParameterName(annotation))) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
     parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }


[servicecomb-java-chassis] 04/12: [SCB-2803]refactor jaxrs parameter processor name

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 87fc24bc4b1ae02bf0a64349093516efe6c35b8b
Author: liubao <bi...@qq.com>
AuthorDate: Fri Aug 11 10:45:10 2023 +0800

    [SCB-2803]refactor jaxrs parameter processor name
---
 .../servicecomb/swagger/generator/ParameterTypeProcessor.java  |  4 ++--
 .../processor/parameter/PartArrayParameterTypeProcessor.java   |  5 ++---
 .../processor/parameter/PartListParameterTypeProcessor.java    |  4 ++--
 .../core/processor/parameter/PartParameterTypeProcessor.java   |  9 ++-------
 ...essor.java => CookieParamParameterAnnotationProcessor.java} |  4 ++--
 ...ocessor.java => FormParamParameterAnnotationProcessor.java} |  2 +-
 ...essor.java => HeaderParamParameterAnnotationProcessor.java} |  4 ++--
 ...erProcessor.java => JaxrsParameterAnnotationProcessor.java} |  2 +-
 ...ocessor.java => PathParamParameterAnnotationProcessor.java} |  2 +-
 ...cessor.java => QueryParamParameterAnnotationProcessor.java} |  2 +-
 ....servicecomb.swagger.generator.ParameterAnnotationProcessor | 10 +++++-----
 .../processor/parameter/MultipartFileArrayProcessor.java       |  5 ++---
 .../processor/parameter/MultipartFileListProcessor.java        |  4 ++--
 .../processor/parameter/MultipartFileTypeProcessor.java        |  9 +++++----
 ...servicecomb.swagger.generator.ParameterAnnotationProcessor} |  5 +----
 ...pache.servicecomb.swagger.generator.ParameterTypeProcessor} |  8 +++-----
 16 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
index 7120040af..e6af81e0d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
@@ -16,10 +16,10 @@
  */
 package org.apache.servicecomb.swagger.generator;
 
-import java.lang.reflect.Type;
+import com.fasterxml.jackson.databind.JavaType;
 
 public interface ParameterTypeProcessor {
-  Type getProcessType();
+  JavaType getProcessType();
 
   void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
index 1d992ab9e..daf9f5845 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
@@ -16,10 +16,9 @@
  */
 package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
-import java.lang.reflect.Type;
-
 import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.v3.oas.models.media.ArraySchema;
@@ -28,7 +27,7 @@ import jakarta.servlet.http.Part;
 
 public class PartArrayParameterTypeProcessor extends PartParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
+  public JavaType getProcessType() {
     return TypeFactory.defaultInstance().constructType(Part[].class);
   }
 
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
index bfd79c512..183f45df8 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
@@ -16,9 +16,9 @@
  */
 package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
-import java.lang.reflect.Type;
 import java.util.List;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.google.inject.util.Types;
 
@@ -26,7 +26,7 @@ import jakarta.servlet.http.Part;
 
 public class PartListParameterTypeProcessor extends PartArrayParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
+  public JavaType getProcessType() {
     return TypeFactory.defaultInstance().constructType(Types.newParameterizedType(List.class, Part.class));
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
index 304d34fe0..d8dd33b1b 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
@@ -16,8 +16,6 @@
  */
 package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
-import java.lang.reflect.Type;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
@@ -27,19 +25,16 @@ import org.apache.servicecomb.swagger.generator.ParameterTypeProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.FileSchema;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.servlet.http.Part;
 import jakarta.ws.rs.core.MediaType;
 
 public class PartParameterTypeProcessor implements ParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
+  public JavaType getProcessType() {
     return TypeFactory.defaultInstance().constructType(Part.class);
   }
 
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
similarity index 93%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
index 51467e936..021fc2b4f 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamParameterAnnotationProcessor.java
@@ -27,8 +27,8 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import jakarta.ws.rs.CookieParam;
 
-public class CookieParamAnnotationProcessor extends
-    JaxrsParameterProcessor<CookieParam> {
+public class CookieParamParameterAnnotationProcessor extends
+    JaxrsParameterAnnotationProcessor<CookieParam> {
   @Override
   public Type getProcessType() {
     return CookieParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
similarity index 94%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
index 106f90ac4..c005e19ab 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamParameterAnnotationProcessor.java
@@ -27,7 +27,7 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import jakarta.ws.rs.FormParam;
 
-public class FormParamAnnotationProcessor extends JaxrsParameterProcessor<FormParam> {
+public class FormParamParameterAnnotationProcessor extends JaxrsParameterAnnotationProcessor<FormParam> {
   @Override
   public Type getProcessType() {
     return FormParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
similarity index 93%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
index 770fc1fbe..4e4f890b0 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamParameterAnnotationProcessor.java
@@ -27,8 +27,8 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import jakarta.ws.rs.HeaderParam;
 
-public class HeaderParamAnnotationProcessor extends
-    JaxrsParameterProcessor<HeaderParam> {
+public class HeaderParamParameterAnnotationProcessor extends
+    JaxrsParameterAnnotationProcessor<HeaderParam> {
   @Override
   public Type getProcessType() {
     return HeaderParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
index ccb271cb9..733633532 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
@@ -19,6 +19,6 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 
-public abstract class JaxrsParameterProcessor<ANNOTATION> implements
+public abstract class JaxrsParameterAnnotationProcessor<ANNOTATION> implements
     ParameterAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
similarity index 94%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
index 22be2a825..e761f1387 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamParameterAnnotationProcessor.java
@@ -27,7 +27,7 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import jakarta.ws.rs.PathParam;
 
-public class PathParamAnnotationProcessor extends JaxrsParameterProcessor<PathParam> {
+public class PathParamParameterAnnotationProcessor extends JaxrsParameterAnnotationProcessor<PathParam> {
   @Override
   public Type getProcessType() {
     return PathParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
similarity index 94%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
index be9517d63..ce03c6814 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamParameterAnnotationProcessor.java
@@ -27,7 +27,7 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import jakarta.ws.rs.QueryParam;
 
-public class QueryParamAnnotationProcessor extends JaxrsParameterProcessor<QueryParam> {
+public class QueryParamParameterAnnotationProcessor extends JaxrsParameterAnnotationProcessor<QueryParam> {
   @Override
   public Type getProcessType() {
     return QueryParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
index 907a43848..85ed03424 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
@@ -15,8 +15,8 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.QueryParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.HeaderParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.CookieParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.FormParamAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathParamParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.QueryParamParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.HeaderParamParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.CookieParamParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.FormParamParameterAnnotationProcessor
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
index b32c1b49c..be5185865 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
@@ -17,16 +17,15 @@
 
 package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 
-import java.lang.reflect.Type;
-
 import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 
 public class MultipartFileArrayProcessor extends PartArrayParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
+  public JavaType getProcessType() {
     return TypeFactory.defaultInstance().constructType(MultipartFile[].class);
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
index 8b7f997de..10e9f98d2 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
@@ -17,18 +17,18 @@
 
 package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 
-import java.lang.reflect.Type;
 import java.util.List;
 
 import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.google.inject.util.Types;
 
 public class MultipartFileListProcessor extends PartArrayParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
+  public JavaType getProcessType() {
     return TypeFactory.defaultInstance().constructType(Types.newParameterizedType(List.class, MultipartFile.class));
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
index c2c9c3475..3781c2b12 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
@@ -17,14 +17,15 @@
 
 package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 
-import java.lang.reflect.Type;
-
 import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
 public class MultipartFileTypeProcessor extends PartParameterTypeProcessor {
   @Override
-  public Type getProcessType() {
-    return MultipartFile.class;
+  public JavaType getProcessType() {
+    return TypeFactory.defaultInstance().constructType(MultipartFile.class);
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor b/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
similarity index 81%
rename from swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
rename to swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
index b54bff4f6..a1deb9304 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
+++ b/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
@@ -15,13 +15,10 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileTypeProcessor
-org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileArrayProcessor
-org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileListProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.CookieValueAnnotationProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.PathVariableAnnotationProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestBodyAnnotationProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestParamParameterProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestHeaderAnnotationProcessor
 org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestPartAnnotationProcessor
-org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestAttributeAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestAttributeAnnotationProcessor
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor b/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
similarity index 61%
copy from swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
copy to swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
index 907a43848..c99b59786 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
+++ b/swagger/swagger-generator/generator-springmvc/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
@@ -15,8 +15,6 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.QueryParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.HeaderParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.CookieParamAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.FormParamAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileTypeProcessor
+org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileArrayProcessor
+org.apache.servicecomb.swagger.generator.springmvc.processor.parameter.MultipartFileListProcessor


[servicecomb-java-chassis] 10/12: [SCB-2803]response support different media types

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit d3ab52dca88bb5d8abdcf5030076fe7ccf5217f5
Author: liubao <bi...@qq.com>
AuthorDate: Tue Aug 15 11:46:19 2023 +0800

    [SCB-2803]response support different media types
---
 .../generator/core/AbstractOperationGenerator.java |  54 ++++---
 .../generator/core/OperationGeneratorContext.java  |  65 ++++++++
 .../annotation/ApiResponseMethodProcessor.java     |  46 +++++-
 .../annotation/ApiResponsesClassProcessor.java     |  43 ------
 .../annotation/ApiResponsesMethodProcessor.java    |  45 +++++-
 .../OperationMethodAnnotationProcessor.java        |  53 ++++++-
 .../generator/pojo/PojoSwaggerGenerator.java       |   2 +-
 ...comb.swagger.generator.ClassAnnotationProcessor |   1 -
 .../swagger/generator/core/TestApiOperation.java   |   4 +-
 .../swagger/generator/core/TestApiResponse.java    |  16 +-
 .../generator/core/TestOperationGenerator.java     |  23 +--
 .../OperationMethodAnnotationProcessorTest.java    |  16 +-
 .../swagger/generator/core/schema/Schema.java      |   6 +-
 .../resources/schemas/ParameterAnnotation.yaml     |  11 ++
 .../src/test/resources/schemas/Schema.yaml         | 163 +++++++++++++++++++--
 .../src/test/resources/schemas/pojoExample1.yaml   |  18 +++
 .../servicecomb/swagger/generator/jaxrs/Echo.java  |   2 +-
 .../generator/jaxrs/FullSwaggerService.java        |  20 ++-
 .../test/resources/schemas/ClassAnnotation.yaml    |  12 ++
 .../test/resources/schemas/FullSwaggerService.yaml |  35 ++++-
 .../src/test/resources/schemas/echo.yaml           |  78 +++++++++-
 .../resources/schemas/DefaultParameterSchema.yaml  |  36 +++++
 .../src/test/resources/schemas/echo.yaml           |  36 +++++
 .../test/resources/schemas/mixupAnnotations.yaml   |  96 ++++++++++++
 .../src/test/resources/schemas/responseEntity.yaml |  60 ++++++++
 25 files changed, 805 insertions(+), 136 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index dbbc9ec14..f23a4d91d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -45,7 +45,6 @@ import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 import org.apache.servicecomb.swagger.generator.ParameterTypeProcessor;
 import org.apache.servicecomb.swagger.generator.ResponseTypeProcessor;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
@@ -62,7 +61,9 @@ import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.Operation;
 import io.swagger.v3.oas.models.PathItem;
 import io.swagger.v3.oas.models.Paths;
+import io.swagger.v3.oas.models.headers.Header;
 import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.MediaType;
 import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
@@ -370,26 +371,43 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
   }
 
   public void scanResponse() {
-    if (swaggerOperation.getResponses() == null) {
-      swaggerOperation.setResponses(new ApiResponses());
-    }
+    operationGeneratorContext.updateProduces();
+    swaggerOperation.setResponses(new ApiResponses());
+    for (Entry<String, Schema<?>> response : operationGeneratorContext.getResponses().entrySet()) {
+      ApiResponse apiResponse = new ApiResponse();
+      if (StringUtils.isNotEmpty(operationGeneratorContext.getResponseDescriptions().get(response.getKey()))) {
+        apiResponse.setDescription(operationGeneratorContext.getResponseDescriptions().get(response.getKey()));
+      }
+      if (operationGeneratorContext.getResponseHeaders().get(response.getKey()) != null) {
+        operationGeneratorContext.getResponseHeaders().get(response.getKey()).forEach((k, v) -> {
+          Header header = new Header();
+          header.setSchema(v);
+          apiResponse.addHeaderObject(k, header);
+        });
+      }
+      Schema<?> schema = response.getValue() != null ? response.getValue() :
+          createResponseModel();
 
-    // If annotations contains ApiResponse, schema must be defined.
-    if (swaggerOperation.getResponses().get(SwaggerConst.SUCCESS_KEY) != null) {
-      return;
-    }
+      if (schema == null) {
+        swaggerOperation.getResponses().addApiResponse(response.getKey(), apiResponse);
+        continue;
+      }
 
-    Schema model = createResponseModel();
-    if (model == null) {
-      return;
+      apiResponse.setContent(new Content());
+      // file download using WILDCARD content-type
+      if ("string".equals(schema.getType()) && "binary".equals(schema.getFormat())) {
+        MediaType mediaType = new MediaType();
+        mediaType.setSchema(schema);
+        apiResponse.getContent().addMediaType(jakarta.ws.rs.core.MediaType.WILDCARD, mediaType);
+      } else {
+        for (String produce : operationGeneratorContext.getSupportedProduces()) {
+          MediaType mediaType = new MediaType();
+          mediaType.setSchema(schema);
+          apiResponse.getContent().addMediaType(produce, mediaType);
+        }
+      }
+      swaggerOperation.getResponses().addApiResponse(response.getKey(), apiResponse);
     }
-    swaggerOperation.getResponses().addApiResponse(SwaggerConst.SUCCESS_KEY, new ApiResponse());
-    swaggerOperation.getResponses().get(SwaggerConst.SUCCESS_KEY).setContent(new Content());
-    swaggerOperation.getResponses().get(SwaggerConst.SUCCESS_KEY).getContent()
-        .addMediaType(SwaggerConst.DEFAULT_MEDIA_TYPE, new io.swagger.v3.oas.models.media.MediaType());
-    swaggerOperation.getResponses().get(SwaggerConst.SUCCESS_KEY).getContent()
-        .get(SwaggerConst.DEFAULT_MEDIA_TYPE)
-        .setSchema(model);
   }
 
   protected Schema createResponseModel() {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
index 650cb11f1..3cf1105c8 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
@@ -16,8 +16,73 @@
  */
 package org.apache.servicecomb.swagger.generator.core;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.swagger.v3.oas.models.media.Schema;
+
 public class OperationGeneratorContext extends SwaggerGeneratorContext {
+  private final Map<String, Schema<?>> responses = new HashMap<>();
+
+  private JavaType responseType;
+
+  private final Map<String, String> responseDescriptions = new HashMap<>();
+
+  // statusCode:headerName:headerSchema
+  private final Map<String, Map<String, Schema<?>>> responseHeaders = new HashMap<>();
+
   public OperationGeneratorContext(SwaggerGeneratorContext parent) {
     super(parent);
+    updateResponse(SwaggerConst.SUCCESS_KEY, null);
+  }
+
+  public Map<String, Schema<?>> getResponses() {
+    return responses;
+  }
+
+  public void updateResponse(String code, Schema<?> schema) {
+    this.responses.put(code, schema);
+  }
+
+  public JavaType getResponseType() {
+    return responseType;
+  }
+
+  public void setResponseType(JavaType responseType) {
+    this.responseType = responseType;
+  }
+
+  public Map<String, String> getResponseDescriptions() {
+    return responseDescriptions;
+  }
+
+  public void updateResponseDescription(String code, String description) {
+    this.responseDescriptions.put(code, description);
+  }
+
+  public Map<String, Map<String, Schema<?>>> getResponseHeaders() {
+    return responseHeaders;
+  }
+
+  public void updateResponseHeader(String code, String header, Schema<?> schema) {
+    this.responseHeaders.computeIfAbsent(code, key -> new HashMap<>());
+    this.responseHeaders.get(code).put(header, schema);
+  }
+
+  public void updateProduces() {
+    List<String> removed = new ArrayList<>();
+    for (String media : supportedProduces) {
+      if (SUPPORTED_BODY_CONTENT_TYPE.contains(media)) {
+        continue;
+      }
+      removed.add(media);
+    }
+    supportedProduces.removeAll(removed);
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponseMethodProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponseMethodProcessor.java
index a34957856..3f6850a21 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponseMethodProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponseMethodProcessor.java
@@ -17,13 +17,20 @@
 package org.apache.servicecomb.swagger.generator.core.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.springframework.util.CollectionUtils;
 
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.models.responses.ApiResponses;
 
 public class ApiResponseMethodProcessor implements MethodAnnotationProcessor<ApiResponse> {
   @Override
@@ -34,11 +41,38 @@ public class ApiResponseMethodProcessor implements MethodAnnotationProcessor<Api
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ApiResponse apiResponse) {
-    if (operationGenerator.getOperation().getResponses() == null) {
-      operationGenerator.getOperation().setResponses(new ApiResponses());
+    List<String> produces = new ArrayList<>();
+    String responseCode = apiResponse.responseCode();
+    if (StringUtils.isEmpty(responseCode) || "default".equals(responseCode)) {
+      responseCode = SwaggerConst.SUCCESS_KEY;
+    }
+    Class<?> type = null;
+    for (Content content : apiResponse.content()) {
+      if (StringUtils.isNotEmpty(content.mediaType())) {
+        produces.add(content.mediaType());
+      }
+      if (content.schema() != null && content.schema().implementation() != Void.class) {
+        type = content.schema().implementation();
+      }
+    }
+    operationGenerator.getOperationGeneratorContext().updateResponse(responseCode,
+        type == null ? null : SwaggerUtils.resolveTypeSchemas(swaggerGenerator.getOpenAPI(), type));
+    if (StringUtils.isNotEmpty(apiResponse.description())) {
+      operationGenerator.getOperationGeneratorContext().updateResponseDescription(responseCode,
+          apiResponse.description());
+    }
+    for (Header header : apiResponse.headers()) {
+      if (header.schema() == null || header.schema().implementation() == Void.class) {
+        throw new IllegalArgumentException("@ApiResponse header schema implementation must be defined.");
+      }
+      if (StringUtils.isEmpty(header.name())) {
+        throw new IllegalArgumentException("@ApiResponse header name must be defined.");
+      }
+      operationGenerator.getOperationGeneratorContext().updateResponseHeader(responseCode,
+          header.name(), AnnotationUtils.schemaModel(swaggerGenerator.getOpenAPI(), header.schema()));
+    }
+    if (!CollectionUtils.isEmpty(produces)) {
+      operationGenerator.getOperationGeneratorContext().updateProduces(produces);
     }
-    operationGenerator.getOperation().getResponses().addApiResponse(
-        AnnotationUtils.responseCodeModel(apiResponse),
-        AnnotationUtils.apiResponseModel(swaggerGenerator.getOpenAPI(), apiResponse));
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesClassProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesClassProcessor.java
deleted file mode 100644
index 88ef6ebc6..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesClassProcessor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.annotation;
-
-import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findClassAnnotationProcessor;
-
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
-import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
-
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-
-
-public class ApiResponsesClassProcessor implements ClassAnnotationProcessor<ApiResponses> {
-  @Override
-  public Type getProcessType() {
-    return ApiResponses.class;
-  }
-
-  @Override
-  public void process(SwaggerGenerator swaggerGenerator, ApiResponses apiResponses) {
-    ClassAnnotationProcessor<ApiResponse> processor = findClassAnnotationProcessor(ApiResponse.class);
-    for (ApiResponse apiResponse : apiResponses.value()) {
-      processor.process(swaggerGenerator, apiResponse);
-    }
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesMethodProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesMethodProcessor.java
index 1e4eea4f1..383598aa1 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesMethodProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiResponsesMethodProcessor.java
@@ -17,11 +17,19 @@
 package org.apache.servicecomb.swagger.generator.core.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.springframework.util.CollectionUtils;
 
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
 
 
@@ -34,8 +42,39 @@ public class ApiResponsesMethodProcessor implements MethodAnnotationProcessor<Ap
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ApiResponses apiResponses) {
-    io.swagger.v3.oas.models.responses.ApiResponses responses =
-        AnnotationUtils.apiResponsesModel(swaggerGenerator.getOpenAPI(), apiResponses);
-    operationGenerator.getOperation().setResponses(responses);
+    List<String> produces = new ArrayList<>();
+    for (ApiResponse apiResponse : apiResponses.value()) {
+      if (StringUtils.isEmpty(apiResponse.responseCode()) || "default".equals(apiResponse.responseCode())) {
+        throw new IllegalArgumentException("@ApiResponse status code must be defined.");
+      }
+      Class<?> type = null;
+      for (Content content : apiResponse.content()) {
+        if (StringUtils.isNotEmpty(content.mediaType())) {
+          produces.add(content.mediaType());
+        }
+        if (content.schema() != null && content.schema().implementation() != Void.class) {
+          type = content.schema().implementation();
+        }
+      }
+      operationGenerator.getOperationGeneratorContext().updateResponse(apiResponse.responseCode(),
+          type == null ? null : SwaggerUtils.resolveTypeSchemas(swaggerGenerator.getOpenAPI(), type));
+      if (StringUtils.isNotEmpty(apiResponse.description())) {
+        operationGenerator.getOperationGeneratorContext().updateResponseDescription(apiResponse.responseCode(),
+            apiResponse.description());
+      }
+      for (Header header : apiResponse.headers()) {
+        if (header.schema() == null || header.schema().implementation() == Void.class) {
+          throw new IllegalArgumentException("@ApiResponse header schema implementation must be defined.");
+        }
+        if (StringUtils.isEmpty(header.name())) {
+          throw new IllegalArgumentException("@ApiResponse header name must be defined.");
+        }
+        operationGenerator.getOperationGeneratorContext().updateResponseHeader(apiResponse.responseCode(),
+            header.name(), AnnotationUtils.schemaModel(swaggerGenerator.getOpenAPI(), header.schema()));
+      }
+    }
+    if (!CollectionUtils.isEmpty(produces)) {
+      operationGenerator.getOperationGeneratorContext().updateProduces(produces);
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
index 6d00f0d6b..86986a90c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
@@ -18,14 +18,20 @@
 package org.apache.servicecomb.swagger.generator.core.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.springframework.util.CollectionUtils;
 
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
 
 public class OperationMethodAnnotationProcessor implements MethodAnnotationProcessor<Operation> {
   public Type getProcessType() {
@@ -36,13 +42,52 @@ public class OperationMethodAnnotationProcessor implements MethodAnnotationProce
   public void process(SwaggerGenerator swaggerGenerator,
       OperationGenerator operationGenerator, Operation apiOperationAnnotation) {
     io.swagger.v3.oas.models.Operation operation = operationGenerator.getOperation();
-    io.swagger.v3.oas.models.Operation specificOperation =
-        AnnotationUtils.operationModel(swaggerGenerator.getOpenAPI(), apiOperationAnnotation);
 
     if (!StringUtils.isEmpty(apiOperationAnnotation.method())) {
       operationGenerator.setHttpMethod(apiOperationAnnotation.method());
     }
 
+    if (apiOperationAnnotation.responses() != null) {
+      // This is a bit different from swagger annotation intention.
+      // Here we assume @Content defines all supported media type and only one implementation class for one status code.
+      List<String> produces = new ArrayList<>();
+      for (ApiResponse apiResponse : apiOperationAnnotation.responses()) {
+        if (StringUtils.isEmpty(apiResponse.responseCode()) || "default".equals(apiResponse.responseCode())) {
+          throw new IllegalArgumentException("@ApiResponse status code must be defined.");
+        }
+        Class<?> type = null;
+        for (Content content : apiResponse.content()) {
+          if (StringUtils.isNotEmpty(content.mediaType())) {
+            produces.add(content.mediaType());
+          }
+          if (content.schema() != null && content.schema().implementation() != Void.class) {
+            type = content.schema().implementation();
+          }
+        }
+        operationGenerator.getOperationGeneratorContext().updateResponse(apiResponse.responseCode(),
+            type == null ? null : SwaggerUtils.resolveTypeSchemas(swaggerGenerator.getOpenAPI(), type));
+        if (StringUtils.isNotEmpty(apiResponse.description())) {
+          operationGenerator.getOperationGeneratorContext().updateResponseDescription(apiResponse.responseCode(),
+              apiResponse.description());
+        }
+        for (Header header : apiResponse.headers()) {
+          if (header.schema() == null || header.schema().implementation() == Void.class) {
+            throw new IllegalArgumentException("@ApiResponse header schema implementation must be defined.");
+          }
+          if (StringUtils.isEmpty(header.name())) {
+            throw new IllegalArgumentException("@ApiResponse header name must be defined.");
+          }
+          operationGenerator.getOperationGeneratorContext().updateResponseHeader(apiResponse.responseCode(),
+              header.name(), AnnotationUtils.schemaModel(swaggerGenerator.getOpenAPI(), header.schema()));
+        }
+      }
+      if (!CollectionUtils.isEmpty(produces)) {
+        operationGenerator.getOperationGeneratorContext().updateProduces(produces);
+      }
+    }
+
+    io.swagger.v3.oas.models.Operation specificOperation =
+        AnnotationUtils.operationModel(swaggerGenerator.getOpenAPI(), apiOperationAnnotation);
     if (!StringUtils.isEmpty(specificOperation.getSummary())) {
       operation.setSummary(specificOperation.getSummary());
     }
@@ -62,9 +107,5 @@ public class OperationMethodAnnotationProcessor implements MethodAnnotationProce
     if (!CollectionUtils.isEmpty(specificOperation.getTags())) {
       operation.setTags(specificOperation.getTags());
     }
-
-    if (!CollectionUtils.isEmpty(specificOperation.getResponses())) {
-      operation.setResponses(specificOperation.getResponses());
-    }
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
index f82c40ec1..0a2e6985a 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
@@ -28,7 +28,7 @@ import jakarta.ws.rs.core.MediaType;
 
 public class PojoSwaggerGenerator extends AbstractSwaggerGenerator {
   protected static final List<String> SUPPORTED_CONTENT_TYPE
-      = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE);
+      = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN);
 
   public PojoSwaggerGenerator(Class<?> cls) {
     super(cls);
diff --git a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
index 21398e599..3b9c9f840 100644
--- a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
+++ b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
@@ -16,4 +16,3 @@
 #
 
 org.apache.servicecomb.swagger.generator.core.processor.annotation.OpenAPIDefinitionProcessor
-org.apache.servicecomb.swagger.generator.core.processor.annotation.ApiResponsesClassProcessor
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
index 046bd42fd..73f63e714 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
@@ -59,7 +59,7 @@ public class TestApiOperation {
         responses = @ApiResponse(responseCode = "202",
             content = @Content(mediaType = MediaType.APPLICATION_JSON,
                 schema = @Schema(implementation = String.class)),
-            headers = @Header(name = "h1", schema = @Schema(type = "integer"))),
+            headers = @Header(name = "h1", schema = @Schema(implementation = Integer.class))),
         extensions = {@Extension(
             name = "x-tagA",
             properties = {@ExtensionProperty(name = "x-tagAExt", value = "value of tagAExt")})})
@@ -107,7 +107,7 @@ public class TestApiOperation {
     Assertions.assertEquals(Arrays.asList("tag1", "tag2"), operation.getTags());
 
     ApiResponses responseMap = operation.getResponses();
-    Assertions.assertEquals(1, responseMap.size());
+    Assertions.assertEquals(2, responseMap.size());
 
     io.swagger.v3.oas.models.responses.ApiResponse response = responseMap.get("202");
     Assertions.assertNotNull(response);
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java
index 1f8615c0b..58e1ebeb7 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java
@@ -40,25 +40,25 @@ public class TestApiResponse {
 
   interface ApiResponseAnnotation {
     @ApiResponse(
-        headers = {@Header(name = "k1", schema = @Schema(type = "integer", format = "int32")),
-            @Header(name = "k2", schema = @Schema(type = "string"))},
+        headers = {@Header(name = "k1", schema = @Schema(implementation = Integer.class)),
+            @Header(name = "k2", schema = @Schema(implementation = String.class))},
         responseCode = "200",
         description = "")
     void testApiResponseHeader();
 
     @ApiResponse(responseCode = "200",
-        headers = {@Header(name = "k1", schema = @Schema(type = "integer", format = "int32"))})
+        headers = {@Header(name = "k1", schema = @Schema(implementation = Integer.class))})
     void testResponseHeader();
 
     @ApiResponse(
-        content = @Content(schema = @Schema(type = "integer", format = "int32")),
+        content = @Content(schema = @Schema(implementation = Integer.class)),
         responseCode = "200",
         description = "msg")
     void testSingle();
 
     @ApiResponses(value = {
-        @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(type = "integer", format = "int32")), description = "msg1"),
-        @ApiResponse(responseCode = "301", content = @Content(schema = @Schema(type = "string")), description = "msg2")})
+        @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = Integer.class)), description = "msg1"),
+        @ApiResponse(responseCode = "301", content = @Content(schema = @Schema(implementation = String.class)), description = "msg2")})
     void testMulti();
   }
 
@@ -98,7 +98,7 @@ public class TestApiResponse {
 
     property = response.getHeaders().get("k2");
     Assertions.assertEquals("string", property.getSchema().getType());
-    Assertions.assertEquals("", property.getSchema().getFormat());
+    Assertions.assertEquals(null, property.getSchema().getFormat());
   }
 
   @Test
@@ -122,6 +122,6 @@ public class TestApiResponse {
 
     response = swaggerOperation.getOperation().getResponses().get("301");
     Assertions.assertEquals("string", response.getContent().get(MediaType.APPLICATION_JSON).getSchema().getType());
-    Assertions.assertEquals("", response.getContent().get(MediaType.APPLICATION_JSON).getSchema().getFormat());
+    Assertions.assertEquals(null, response.getContent().get(MediaType.APPLICATION_JSON).getSchema().getFormat());
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
index bfd314139..f238e91ff 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
@@ -51,12 +51,12 @@ public class TestOperationGenerator {
   private static class TestClass {
     @ApiResponse(responseCode = "200", description = "200 is ok............",
         content = @Content(mediaType = "application/json", schema = @Schema(name = "String")),
-        headers = @Header(name = "x-user-domain", schema = @Schema(name = "String")))
+        headers = @Header(name = "x-user-domain", schema = @Schema(implementation = String.class)))
     @Operation(summary = "value1", tags = {"tag1", "tag2"},
         responses = {
             @ApiResponse(responseCode = "200", headers =
-                {@Header(name = "x-user-name", schema = @Schema(name = "String")),
-                    @Header(name = "x-user-id", schema = @Schema(name = "String"))})},
+                {@Header(name = "x-user-name", schema = @Schema(implementation = String.class)),
+                    @Header(name = "x-user-id", schema = @Schema(implementation = String.class))})},
         extensions = {
             @Extension(name = "x-class-name", properties = @ExtensionProperty(value = "value", name = "key"))})
     public void responseThenApiOperation() {
@@ -64,14 +64,14 @@ public class TestOperationGenerator {
 
     @Operation(summary = "value1", tags = {"tag1", "tag2"},
         responses = {@ApiResponse(responseCode = "200", headers = {
-            @Header(name = "x-user-name", schema = @Schema(name = "String")),
-            @Header(name = "x-user-id", schema = @Schema(name = "String"))})},
+            @Header(name = "x-user-name", schema = @Schema(implementation = String.class)),
+            @Header(name = "x-user-id", schema = @Schema(implementation = String.class))})},
         extensions = {
             @Extension(name = "x-class-name", properties = {
                 @ExtensionProperty(value = "value", name = "key")})})
     @ApiResponse(responseCode = "200", description = "200 is ok............",
-        content = @Content(mediaType = "application/json", schema = @Schema(name = "String")),
-        headers = @Header(name = "x-user-domain", schema = @Schema(name = "String")))
+        content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)),
+        headers = @Header(name = "x-user-domain", schema = @Schema(implementation = String.class)))
     public void apiOperationThenResponse() {
     }
 
@@ -106,10 +106,11 @@ public class TestOperationGenerator {
     MatcherAssert.assertThat(tags, contains("tag1", "tag2"));
 
     io.swagger.v3.oas.models.responses.ApiResponse response = swaggerOperation.getOperation().getResponses().get("200");
-    Assertions.assertEquals("response of 200", response.getDescription());
-    Assertions.assertNull(response.getHeaders().get("x-user-domain"));
+    Assertions.assertEquals("200 is ok............", response.getDescription());
+    Assertions.assertNotNull(response.getHeaders().get("x-user-domain"));
     Assertions.assertNotNull(response.getHeaders().get("x-user-name"));
     Assertions.assertNotNull(swaggerOperation.getOperation().getExtensions().get("x-class-name"));
+    Assertions.assertNull(swaggerOperation.getOperation().getExtensions().get("x-not-exists"));
   }
 
   @Test
@@ -119,8 +120,8 @@ public class TestOperationGenerator {
     MatcherAssert.assertThat(tags, contains("tag1", "tag2"));
 
     io.swagger.v3.oas.models.responses.ApiResponse response = swaggerOperation.getOperation().getResponses().get("200");
-    Assertions.assertEquals("response of 200", response.getDescription());
-    Assertions.assertNull(response.getHeaders().get("x-user-domain"));
+    Assertions.assertEquals("200 is ok............", response.getDescription());
+    Assertions.assertNotNull(response.getHeaders().get("x-user-domain"));
     Assertions.assertNotNull(response.getHeaders().get("x-user-name"));
     Assertions.assertNotNull(swaggerOperation.getOperation().getExtensions().get("x-class-name"));
   }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
index 70d2f344f..b4720f15d 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
@@ -58,9 +58,10 @@ public class OperationMethodAnnotationProcessorTest {
     public void functionWithNoTag() {
     }
 
+    // mediaType will be ignored
     @Operation(summary = "testSingleMediaType",
         responses = {@ApiResponse(responseCode = "200", content = @Content(
-            mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = String.class)))})
+            mediaType = MediaType.TEXT_PLAIN, schema = @Schema(implementation = String.class)))})
     public String testSingleMediaType(String input) {
       return input;
     }
@@ -76,7 +77,7 @@ public class OperationMethodAnnotationProcessorTest {
     }
 
     @Operation(summary = "testBlankMediaType",
-        responses = {@ApiResponse(content = @Content(mediaType = ""))},
+        responses = {@ApiResponse(responseCode = "200", content = @Content(mediaType = ""))},
         requestBody = @RequestBody(content = @Content(mediaType = "",
             schema = @Schema(implementation = String.class))))
     public String testBlankMediaType(String input) {
@@ -144,7 +145,7 @@ public class OperationMethodAnnotationProcessorTest {
   public void testMultiMediaType() {
     SwaggerOperation swaggerOperation = swaggerOperations.findOperation("testMultiMediaType");
     MatcherAssert.assertThat(swaggerOperation.getOperation().getRequestBody().getContent().keySet(),
-        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE));
+        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN));
     MatcherAssert.assertThat(swaggerOperation.getOperation().getResponses().get("200").getContent().keySet(),
         Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
   }
@@ -156,7 +157,7 @@ public class OperationMethodAnnotationProcessorTest {
             .getRequestBody().getContent().get(MediaType.APPLICATION_JSON).getSchema().get$ref(),
         Matchers.equalTo(Components.COMPONENTS_SCHEMAS_REF + "testSingleMediaTypeBody"));
     MatcherAssert.assertThat(swaggerOperation.getOperation()
-            .getResponses().get("200").getContent().get(MediaType.APPLICATION_XML).getSchema().getType(),
+            .getResponses().get("200").getContent().get(MediaType.TEXT_PLAIN).getSchema().getType(),
         Matchers.equalTo("string"));
   }
 
@@ -164,9 +165,10 @@ public class OperationMethodAnnotationProcessorTest {
   public void testBlankMediaType() {
     SwaggerOperation swaggerOperation = swaggerOperations.findOperation("testBlankMediaType");
     MatcherAssert.assertThat(swaggerOperation.getOperation().getRequestBody().getContent().keySet(),
-        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE));
-    MatcherAssert.assertThat(swaggerOperation.getOperation().getResponses().getDefault().getContent().keySet(),
-        Matchers.contains(MediaType.APPLICATION_JSON));
+        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN));
+    MatcherAssert.assertThat(swaggerOperation.getOperation().getResponses()
+            .get(SwaggerConst.SUCCESS_KEY).getContent().keySet(),
+        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN));
   }
 
   @Test
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
index c370c3b1f..de65caa81 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
@@ -42,19 +42,19 @@ public class Schema {
   }
 
   @ApiResponse(headers = {@Header(name = "h",
-      schema = @io.swagger.v3.oas.annotations.media.Schema(type = "string"))}, responseCode = "200", description = "")
+      schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = String.class))}, responseCode = "200", description = "")
   public void testApiResponse() {
 
   }
 
   @ApiResponse(headers = {@Header(name = "h",
-      schema = @io.swagger.v3.oas.annotations.media.Schema(type = "string"))}, description = "")
+      schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = String.class))}, description = "")
   public void testApiOperation() {
 
   }
 
   @ApiResponse(headers = {@Header(name = "h",
-      schema = @io.swagger.v3.oas.annotations.media.Schema(type = "string"))})
+      schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = String.class))})
   public void testResponseHeader() {
 
   }
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml
index 5c2ffe0ee..64e81e853 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml
@@ -35,6 +35,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/differentNameBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/differentNameBody'
         x-name: differentNameBody
       responses:
         "200":
@@ -44,6 +47,14 @@ paths:
               schema:
                 type: integer
                 format: int32
+            application/protobuf:
+              schema:
+                type: integer
+                format: int32
+            text/plain:
+              schema:
+                type: integer
+                format: int32
 components:
   schemas:
     differentNameBody:
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
index 44d2ad5bf..0de5a305e 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
@@ -34,6 +34,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/ignoreRequestBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/ignoreRequestBody'
         x-name: ignoreRequestBody
       responses:
         "200":
@@ -49,6 +52,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/nestedListStringBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/nestedListStringBody'
         x-name: nestedListStringBody
       responses:
         "200":
@@ -61,6 +67,20 @@ paths:
                   type: array
                   items:
                     type: string
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
+            text/plain:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
   /testAllType:
     post:
       operationId: testAllType
@@ -72,6 +92,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/AllType'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/AllType'
         x-name: obj
       responses:
         "200":
@@ -80,18 +103,15 @@ paths:
     post:
       operationId: testApiOperation
       responses:
-        default:
-          description: response of default
+        "200":
+          description: response of 200
           headers:
             h:
-              description: ""
               schema:
                 type: string
                 description: ""
-                format: ""
                 nullable: false
                 example: ""
-          content: {}
   /testApiResponse:
     post:
       operationId: testApiResponse
@@ -100,14 +120,11 @@ paths:
           description: response of 200
           headers:
             h:
-              description: ""
               schema:
                 type: string
                 description: ""
-                format: ""
                 nullable: false
                 example: ""
-          content: {}
   /testArray:
     post:
       operationId: testArray
@@ -119,6 +136,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testArrayBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testArrayBody'
         x-name: testArrayBody
       responses:
         "200":
@@ -134,6 +154,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testBooleanBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testBooleanBody'
         x-name: testBooleanBody
       responses:
         "200":
@@ -149,6 +172,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testByteBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testByteBody'
         x-name: testByteBody
       responses:
         "200":
@@ -164,6 +190,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testBytesBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testBytesBody'
         x-name: testBytesBody
       responses:
         "200":
@@ -179,6 +208,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testCharBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testCharBody'
         x-name: testCharBody
       responses:
         "200":
@@ -193,6 +225,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testCompletableFutureOptional:
     post:
       operationId: testCompletableFutureOptional
@@ -203,6 +241,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testDate:
     post:
       operationId: testDate
@@ -214,6 +258,14 @@ paths:
               schema:
                 type: string
                 format: date-time
+            application/protobuf:
+              schema:
+                type: string
+                format: date-time
+            text/plain:
+              schema:
+                type: string
+                format: date-time
   /testDouble:
     post:
       operationId: testDouble
@@ -225,6 +277,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testDoubleBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testDoubleBody'
         x-name: testDoubleBody
       responses:
         "200":
@@ -240,6 +295,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testEnumBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testEnumBody'
         x-name: testEnumBody
       responses:
         "200":
@@ -255,6 +313,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testFloatBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testFloatBody'
         x-name: testFloatBody
       responses:
         "200":
@@ -270,6 +331,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testIntegerBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testIntegerBody'
         x-name: testIntegerBody
       responses:
         "200":
@@ -285,6 +349,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testListBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testListBody'
         x-name: testListBody
       responses:
         "200":
@@ -300,6 +367,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testLongBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testLongBody'
         x-name: testLongBody
       responses:
         "200":
@@ -315,6 +385,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testMapBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testMapBody'
         x-name: testMapBody
       responses:
         "200":
@@ -330,6 +403,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testMapListBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testMapListBody'
         x-name: testMapListBody
       responses:
         "200":
@@ -345,6 +421,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testMultiParamBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testMultiParamBody'
         x-name: testMultiParamBody
       responses:
         "200":
@@ -355,6 +434,16 @@ paths:
                 type: array
                 items:
                   type: string
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  type: string
+            text/plain:
+              schema:
+                type: array
+                items:
+                  type: string
   /testObject:
     post:
       operationId: testObject
@@ -366,6 +455,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         x-name: user
       responses:
         "200":
@@ -381,6 +473,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testOneEnumBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testOneEnumBody'
         x-name: testOneEnumBody
       responses:
         "200":
@@ -395,22 +490,25 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testResponseHeader:
     post:
       operationId: testResponseHeader
       responses:
-        default:
-          description: response of default
+        "200":
+          description: response of 200
           headers:
             h:
-              description: ""
               schema:
                 type: string
                 description: ""
-                format: ""
                 nullable: false
                 example: ""
-          content: {}
   /testSet:
     post:
       operationId: testSet
@@ -422,6 +520,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testSetBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testSetBody'
         x-name: testSetBody
       responses:
         "200":
@@ -437,6 +538,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testShortBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testShortBody'
         x-name: testShortBody
       responses:
         "200":
@@ -452,6 +556,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testStringBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testStringBody'
         x-name: testStringBody
       responses:
         "200":
@@ -467,6 +574,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testbooleanBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testbooleanBody'
         x-name: testbooleanBody
       responses:
         "200":
@@ -482,6 +592,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testbyteBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testbyteBody'
         x-name: testbyteBody
       responses:
         "200":
@@ -497,6 +610,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testbytesBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testbytesBody'
         x-name: testbytesBody
       responses:
         "200":
@@ -512,6 +628,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testcharBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testcharBody'
         x-name: testcharBody
       responses:
         "200":
@@ -527,6 +646,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testdoubleBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testdoubleBody'
         x-name: testdoubleBody
       responses:
         "200":
@@ -542,6 +664,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testfloatBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testfloatBody'
         x-name: testfloatBody
       responses:
         "200":
@@ -557,6 +682,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testintBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testintBody'
         x-name: testintBody
       responses:
         "200":
@@ -572,6 +700,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testlongBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testlongBody'
         x-name: testlongBody
       responses:
         "200":
@@ -587,6 +718,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testshortBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testshortBody'
         x-name: testshortBody
       responses:
         "200":
@@ -602,6 +736,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/wrapToBodyWithDescBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/wrapToBodyWithDescBody'
         x-name: wrapToBodyWithDescBody
       responses:
         "200":
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
index 096e157a2..1ba1c76fc 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
@@ -34,6 +34,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/testMultiParameterBody'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/testMultiParameterBody'
         x-name: testMultiParameterBody
       responses:
         "200":
@@ -42,6 +45,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/XXX'
+            application/protobuf:
+              schema:
+                $ref: '#/components/schemas/XXX'
+            text/plain:
+              schema:
+                $ref: '#/components/schemas/XXX'
   /testOneParameter:
     post:
       operationId: testOneParameter
@@ -53,6 +62,9 @@ paths:
           application/protobuf:
             schema:
               $ref: '#/components/schemas/XXX'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/XXX'
         x-name: testType1
       responses:
         "200":
@@ -61,6 +73,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/XXX'
+            application/protobuf:
+              schema:
+                $ref: '#/components/schemas/XXX'
+            text/plain:
+              schema:
+                $ref: '#/components/schemas/XXX'
 components:
   schemas:
     XXX:
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
index 67a8ac39c..2bae2974c 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
@@ -61,7 +61,7 @@ public class Echo {
 
   @POST
   @ApiResponse(content = {
-      @Content(schema = @Schema(type = "number", format = "int32"))}, responseCode = "200", description = "")
+      @Content(schema = @Schema(implementation = Integer.class))}, responseCode = "200", description = "")
   @Path("response")
   public Response response() {
     return null;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/FullSwaggerService.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/FullSwaggerService.java
index 5541b4a63..d8cb38fa4 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/FullSwaggerService.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/FullSwaggerService.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.swagger.generator.jaxrs;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.List;
 
@@ -60,11 +61,16 @@ public class FullSwaggerService {
     return "Hello " + a + b + c + d + e;
   }
 
-  // TODO: should produces text/plain for string
-//  @Path("/textPlain")
-//  @GET
-//  @Produces(MediaType.TEXT_PLAIN)
-//  public String textPlain() {
-//    return null;
-//  }
+  @Path("/textPlain")
+  @GET
+  @Produces(MediaType.TEXT_PLAIN)
+  public String textPlain() {
+    return null;
+  }
+
+  @Path("/fileDownload")
+  @GET
+  public File fileDownload() {
+    return null;
+  }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
index a1c4739d5..46b0d2449 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
@@ -39,6 +39,9 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                $ref: '#/components/schemas/User'
   /testForm:
     post:
       operationId: testForm
@@ -58,6 +61,9 @@ paths:
             application/json:
               schema:
                 type: string
+            text/plain:
+              schema:
+                type: string
   /testString:
     post:
       operationId: testString
@@ -74,6 +80,9 @@ paths:
             application/json:
               schema:
                 type: string
+            text/plain:
+              schema:
+                type: string
   /testUpload:
     post:
       operationId: testUpload
@@ -93,6 +102,9 @@ paths:
             application/json:
               schema:
                 type: string
+            text/plain:
+              schema:
+                type: string
 components:
   schemas:
     User:
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
index 2fb53e131..3e7cfa134 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
@@ -63,6 +63,23 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
+  /fileDownload:
+    get:
+      operationId: fileDownload
+      responses:
+        "200":
+          description: response of 200
+          content:
+            '*/*':
+              schema:
+                type: string
+                format: binary
   /fileUpload:
     post:
       operationId: fileUpload
@@ -82,7 +99,7 @@ paths:
         "200":
           description: response of 200
           content:
-            application/json:
+            text/plain:
               schema:
                 type: string
   /queryListMULTI:
@@ -105,4 +122,20 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
+  /textPlain:
+    get:
+      operationId: textPlain
+      responses:
+        "200":
+          description: response of 200
+          content:
+            text/plain:
+              schema:
+                type: string
 components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
index 3776926a6..04ba2b2be 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
@@ -160,6 +160,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /dynamicStatusEnum:
     post:
       operationId: dynamicStatusEnum
@@ -198,6 +204,14 @@ paths:
               schema:
                 type: integer
                 format: int32
+            application/protobuf:
+              schema:
+                type: integer
+                format: int32
+            text/plain:
+              schema:
+                type: integer
+                format: int32
   /echo/{targetName}:
     post:
       operationId: echo
@@ -234,6 +248,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /emptyPath:
     post:
       operationId: emptyPath
@@ -288,6 +308,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /jdkStatusEnum:
     post:
       operationId: jdkStatusEnum
@@ -332,6 +358,18 @@ paths:
                 enum:
                 - BAD_REQUEST
                 - NOT_FOUND
+            application/protobuf:
+              schema:
+                type: string
+                enum:
+                - BAD_REQUEST
+                - NOT_FOUND
+            text/plain:
+              schema:
+                type: string
+                enum:
+                - BAD_REQUEST
+                - NOT_FOUND
   /nestedListString:
     post:
       operationId: nestedListString
@@ -370,6 +408,20 @@ paths:
                   type: array
                   items:
                     type: string
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
+            text/plain:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
   /:
     patch:
       operationId: patch
@@ -391,6 +443,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /queryComplex:
     get:
       operationId: queryComplex
@@ -408,6 +466,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testRawJson:
     post:
       operationId: rawJsonStringMethod
@@ -434,15 +498,19 @@ paths:
       responses:
         "200":
           description: response of 200
-          headers: {}
           content:
             application/json:
               schema:
-                type: number
-                description: ""
+                type: integer
+                format: int32
+            application/protobuf:
+              schema:
+                type: integer
+                format: int32
+            text/plain:
+              schema:
+                type: integer
                 format: int32
-                nullable: false
-                example: ""
 components:
   schemas:
     AggregatedParam:
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DefaultParameterSchema.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DefaultParameterSchema.yaml
index 568dc238f..42c4a2ad0 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DefaultParameterSchema.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DefaultParameterSchema.yaml
@@ -38,6 +38,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testMultipleMediaType:
     put:
       operationId: testMultipleMediaType
@@ -53,6 +59,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testObjectParam:
     get:
       operationId: testObjectParam
@@ -73,6 +85,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testSimpleParam:
     get:
       operationId: testSimpleParam
@@ -88,6 +106,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testSingleMediaType:
     post:
       operationId: testSingleMediaType
@@ -103,6 +127,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testUnsupportedParamType:
     get:
       operationId: testUnsupportedParamType
@@ -131,6 +161,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
 components:
   schemas:
     TestParam:
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
index 97837adfb..7e70e366c 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
@@ -35,6 +35,16 @@ paths:
                 type: array
                 items:
                   type: string
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  type: string
+            text/plain:
+              schema:
+                type: array
+                items:
+                  type: string
   /cookie:
     put:
       operationId: cookie
@@ -136,6 +146,20 @@ paths:
                   type: array
                   items:
                     type: string
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
+            text/plain:
+              schema:
+                type: array
+                items:
+                  type: array
+                  items:
+                    type: string
   /part:
     put:
       operationId: part
@@ -264,6 +288,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testResponseEntityOptional:
     put:
       operationId: testResponseEntityOptional
@@ -274,4 +304,10 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
 components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
index 7c04f5016..1644797b0 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
@@ -50,6 +50,14 @@ paths:
               schema:
                 type: string
                 format: byte
+            application/protobuf:
+              schema:
+                type: string
+                format: byte
+            text/plain:
+              schema:
+                type: string
+                format: byte
   /defaultQueryParam:
     post:
       operationId: defaultQueryParam
@@ -78,6 +86,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /diffNames:
     get:
       summary: differentName
@@ -103,6 +117,14 @@ paths:
               schema:
                 type: integer
                 format: int32
+            application/protobuf:
+              schema:
+                type: integer
+                format: int32
+            text/plain:
+              schema:
+                type: integer
+                format: int32
   /upload:
     post:
       operationId: fileUpload
@@ -125,6 +147,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /reduce:
     get:
       operationId: reduce
@@ -148,6 +176,14 @@ paths:
               schema:
                 type: integer
                 format: int32
+            application/protobuf:
+              schema:
+                type: integer
+                format: int32
+            text/plain:
+              schema:
+                type: integer
+                format: int32
   /testDefaultValue:
     get:
       operationId: testDefaultValue
@@ -193,6 +229,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /testImplicitForm:
     post:
       operationId: testImplicitForm
@@ -218,6 +260,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /uploadFileAndAttribute:
     post:
       operationId: uploadFileAndAttribute
@@ -239,6 +287,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /uploadFilesAndAttribute:
     post:
       operationId: uploadFilesAndAttribute
@@ -262,6 +316,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingDeleteMapping/{targetName}:
     delete:
       operationId: usingDeleteMapping
@@ -301,6 +361,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingGetMapping/{targetName}:
     get:
       operationId: usingGetMapping
@@ -340,6 +406,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingPatchMapping/{targetName}:
     patch:
       operationId: usingPatchMapping
@@ -379,6 +451,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingPostMapping/{targetName}:
     post:
       operationId: usingPostMapping
@@ -418,6 +496,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingPutMapping/{targetName}:
     put:
       operationId: usingPutMapping
@@ -457,6 +541,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
   /usingRequestMapping/{targetName}:
     post:
       operationId: usingRequestMapping
@@ -496,6 +586,12 @@ paths:
             application/json:
               schema:
                 type: string
+            application/protobuf:
+              schema:
+                type: string
+            text/plain:
+              schema:
+                type: string
 components:
   schemas:
     User:
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/responseEntity.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/responseEntity.yaml
index 036f362a2..53459a889 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/responseEntity.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/responseEntity.yaml
@@ -35,6 +35,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
   /usingGetMapping:
     get:
       operationId: usingGetMapping
@@ -47,6 +57,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
   /usingPatchMapping:
     patch:
       operationId: usingPatchMapping
@@ -59,6 +79,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
   /usingPostMapping:
     post:
       operationId: usingPostMapping
@@ -71,6 +101,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
   /usingPutMapping:
     put:
       operationId: usingPutMapping
@@ -83,6 +123,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
   /usingRequestMapping:
     put:
       operationId: usingRequestMapping
@@ -95,6 +145,16 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/User'
+            application/protobuf:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
+            text/plain:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/User'
 components:
   schemas:
     User:


[servicecomb-java-chassis] 01/12: [SCB-2803]refactoring swagger generator to support many codec implementations

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 792d7c76bc7a705e00543778df7790acd15c950d
Author: liubao <bi...@qq.com>
AuthorDate: Thu Aug 10 20:28:51 2023 +0800

    [SCB-2803]refactoring swagger generator to support many codec implementations
---
 .../swagger/generator/OperationGenerator.java      |   7 +
 ...ator.java => ParameterAnnotationProcessor.java} |  18 +-
 .../swagger/generator/ParameterGenerator.java      | 128 +++++++++-----
 .../swagger/generator/ParameterTypeProcessor.java} |  12 +-
 .../swagger/generator/SwaggerConst.java            |   2 +
 .../swagger/generator/SwaggerGenerator.java        |   3 +
 .../swagger/generator/SwaggerGeneratorUtils.java   |  26 +++
 ...va => SwaggerParameterAnnotationProcessor.java} |  21 +--
 .../generator/core/AbstractOperationGenerator.java | 188 +++++----------------
 .../generator/core/AbstractSwaggerGenerator.java   |  12 +-
 .../generator/core/OperationGeneratorContext.java} |  13 +-
 .../generator/core/ParameterGeneratorContext.java  |  87 ++++++++++
 .../generator/core/SwaggerGeneratorContext.java    |  81 +++++++++
 .../OperationMethodAnnotationProcessor.java        |   8 +-
 .../processor/parameter/EnumPostProcessor.java     | 103 +++++------
 .../processor/parameter/JsonViewProcessor.java     |  72 --------
 .../ParameterParameterAnnotationProcessor.java     |  64 +++++++
 .../parameter/ParameterParameterProcessor.java     |  81 ---------
 ...r.java => PartArrayParameterTypeProcessor.java} |  16 +-
 .../processor/parameter/PartArrayProcessor.java    |  84 ---------
 ...or.java => PartListParameterTypeProcessor.java} |   6 +-
 .../parameter/PartParameterTypeProcessor.java      |  65 +++++++
 .../core/processor/parameter/PartProcessor.java    |  85 ----------
 .../parameter/RawJsonRequestBodyProcessor.java     |  50 ++----
 .../RequestBodyParameterAnnotationProcessor.java}  |  24 ++-
 .../parameter/RequestBodyParameterProcessor.java   |  90 ----------
 .../generator/pojo/PojoOperationGenerator.java     | 139 ++++-----------
 .../generator/pojo/PojoSwaggerGenerator.java       |  10 ++
 ...ecomb.swagger.generator.ParameterTypeProcessor} |  11 +-
 ....generator.SwaggerParameterAnnotationProcessor} |   4 +-
 .../swagger/generator/core/TestApiOperation.java   |   5 -
 .../OperationMethodAnnotationProcessorTest.java    |  24 +--
 .../swagger/generator/core/schema/Schema.java      |  18 +-
 .../src/test/resources/schemas/Schema.yaml         | 146 ++++++++++------
 .../src/test/resources/schemas/pojoExample1.yaml   |   6 +
 .../generator/jaxrs/JaxrsOperationGenerator.java   |  10 --
 ....java => ConsumesClassAnnotationProcessor.java} |  17 +-
 ...java => ConsumesMethodAnnotationProcessor.java} |  10 +-
 .../annotation/CookieParamAnnotationProcessor.java |   2 +-
 ...r.java => DeleteMethodAnnotationProcessor.java} |   2 +-
 .../annotation/FormParamAnnotationProcessor.java   |   2 +-
 ...ssor.java => GetMethodAnnotationProcessor.java} |   9 +-
 .../annotation/HeaderParamAnnotationProcessor.java |   2 +-
 ...sor.java => JaxrsClassAnnotationProcessor.java} |   9 +-
 ...or.java => JaxrsMethodAnnotationProcessor.java} |  14 +-
 ...Processor.java => JaxrsParameterProcessor.java} |  12 +-
 ...or.java => PatchMethodAnnotationProcessor.java} |   2 +-
 .../annotation/PathClassAnnotationProcessor.java   |   2 +-
 .../annotation/PathMethodAnnotationProcessor.java  |   2 +-
 .../annotation/PathParamAnnotationProcessor.java   |   2 +-
 ...sor.java => PostMethodAnnotationProcessor.java} |   2 +-
 ....java => ProducesClassAnnotationProcessor.java} |  17 +-
 ...java => ProducesMethodAnnotationProcessor.java} |  10 +-
 ...ssor.java => PutMethodAnnotationProcessor.java} |   2 +-
 .../annotation/QueryParamAnnotationProcessor.java  |   2 +-
 ...comb.swagger.generator.ClassAnnotationProcessor |   4 +-
 ...omb.swagger.generator.MethodAnnotationProcessor |  14 +-
 .../swagger/generator/jaxrs/ClassAnnotation.java   |  75 ++++++++
 .../generator/jaxrs/TestClassAnnotation.java}      |  31 ++--
 .../test/resources/schemas/ClassAnnotation.yaml}   |  51 ++----
 .../springmvc/SpringmvcOperationGenerator.java     |   5 +-
 .../parameter/MultipartFileArrayProcessor.java     |   4 +-
 .../parameter/MultipartFileListProcessor.java      |   4 +-
 .../parameter/MultipartFileTypeProcessor.java      |   4 +-
 64 files changed, 924 insertions(+), 1107 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
index 481d6845a..229039190 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
@@ -17,9 +17,14 @@
 package org.apache.servicecomb.swagger.generator;
 
 
+import org.apache.servicecomb.swagger.generator.core.OperationGeneratorContext;
+
+import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.Operation;
 
 public interface OperationGenerator {
+  OpenAPI getSwagger();
+
   Operation getOperation();
 
   void setHttpMethod(String httpMethod);
@@ -31,4 +36,6 @@ public interface OperationGenerator {
   void setPath(String value);
 
   void generateResponse();
+
+  OperationGeneratorContext getOperationGeneratorContext();
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
similarity index 75%
copy from swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
index 481d6845a..e1a61098e 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterAnnotationProcessor.java
@@ -16,19 +16,11 @@
  */
 package org.apache.servicecomb.swagger.generator;
 
+import java.lang.reflect.Type;
 
-import io.swagger.v3.oas.models.Operation;
+public interface ParameterAnnotationProcessor<ANNOTATION> {
+  Type getProcessType();
 
-public interface OperationGenerator {
-  Operation getOperation();
-
-  void setHttpMethod(String httpMethod);
-
-  String getHttpMethod();
-
-  void addOperationToSwagger();
-
-  void setPath(String value);
-
-  void generateResponse();
+  void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, ANNOTATION annotation);
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index dcddfed5e..ab6385634 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -19,20 +19,27 @@ package org.apache.servicecomb.swagger.generator;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Executable;
 import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.servicecomb.swagger.generator.core.ParameterGeneratorContext;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.parameters.CookieParameter;
+import io.swagger.v3.oas.models.parameters.HeaderParameter;
 import io.swagger.v3.oas.models.parameters.Parameter;
+import io.swagger.v3.oas.models.parameters.PathParameter;
+import io.swagger.v3.oas.models.parameters.QueryParameter;
 import io.swagger.v3.oas.models.parameters.RequestBody;
 
 public class ParameterGenerator {
-  private final String parameterName;
-
   private final List<Annotation> annotations;
 
   /**
@@ -42,60 +49,57 @@ public class ParameterGenerator {
 
   private HttpParameterType httpParameterType;
 
-  private Parameter generatedParameter;
+  private final OperationGenerator operationGenerator;
 
-  private RequestBody generatedRequestBody;
+  private final ParameterGeneratorContext parameterGeneratorContext;
 
-  public ParameterGenerator(String parameterName, List<Annotation> annotations, JavaType genericType,
-      HttpParameterType httpParameterType, Parameter generatedParameter) {
-    this.parameterName = parameterName;
-    this.annotations = annotations;
-    this.genericType = genericType;
-    this.httpParameterType = httpParameterType;
-    this.generatedParameter = generatedParameter;
-  }
-
-  public ParameterGenerator(String parameterName, List<Annotation> annotations, JavaType genericType,
-      HttpParameterType httpParameterType, RequestBody generatedRequestBody) {
-    this.parameterName = parameterName;
-    this.annotations = annotations;
-    this.genericType = genericType;
-    this.httpParameterType = httpParameterType;
-    this.generatedRequestBody = generatedRequestBody;
+  public ParameterGenerator(OperationGenerator operationGenerator, String parameterName) {
+    this.genericType = null;
+    this.operationGenerator = operationGenerator;
+    this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
+    this.parameterGeneratorContext.setParameterName(parameterName);
+    this.annotations = Collections.emptyList();
   }
 
-  public ParameterGenerator(Executable executable, Map<String, List<Annotation>> methodAnnotationMap,
+  public ParameterGenerator(OperationGenerator operationGenerator, Executable executable,
+      Map<String, List<Annotation>> methodAnnotationMap,
       String defaultName,
       Annotation[] parameterAnnotations, Type genericType) {
-    this.parameterName = SwaggerGeneratorUtils.collectParameterName(executable, parameterAnnotations,
+    this.operationGenerator = operationGenerator;
+    String parameterName = SwaggerGeneratorUtils.collectParameterName(executable, parameterAnnotations,
         defaultName);
     this.annotations = SwaggerGeneratorUtils.collectParameterAnnotations(parameterAnnotations,
         methodAnnotationMap,
         parameterName);
+    this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
+    this.parameterGeneratorContext.setParameterName(parameterName);
     this.genericType = TypeFactory.defaultInstance()
         .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, genericType));
     this.httpParameterType = SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType);
   }
 
-  public ParameterGenerator(Executable executable, Map<String, List<Annotation>> methodAnnotationMap,
+  public ParameterGenerator(OperationGenerator operationGenerator, Executable executable,
+      Map<String, List<Annotation>> methodAnnotationMap,
       java.lang.reflect.Parameter methodParameter, Type genericType) {
-    this(executable,
+    this(operationGenerator, executable,
         methodAnnotationMap,
         methodParameter.isNamePresent() ? methodParameter.getName() : null,
         methodParameter.getAnnotations(),
         genericType);
   }
 
-  public ParameterGenerator(String parameterName, List<Annotation> annotations) {
-    this.parameterName = parameterName;
+  public ParameterGenerator(OperationGenerator operationGenerator, String parameterName, List<Annotation> annotations) {
+    this.operationGenerator = operationGenerator;
+    this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
+    this.parameterGeneratorContext.setParameterName(parameterName);
     this.annotations = annotations;
     this.genericType = TypeFactory.defaultInstance()
         .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, null));
     this.httpParameterType = SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType);
   }
 
-  public String getParameterName() {
-    return parameterName;
+  public ParameterGeneratorContext getParameterGeneratorContext() {
+    return this.parameterGeneratorContext;
   }
 
   public List<Annotation> getAnnotations() {
@@ -114,19 +118,59 @@ public class ParameterGenerator {
     this.httpParameterType = httpParameterType;
   }
 
-  public Parameter getGeneratedParameter() {
-    return generatedParameter;
-  }
-
-  public void setGeneratedParameter(Parameter generatedParameter) {
-    this.generatedParameter = generatedParameter;
-  }
-
-  public void setGeneratedRequestBody(RequestBody generatedRequestBody) {
-    this.generatedRequestBody = generatedRequestBody;
-  }
-
-  public RequestBody getGeneratedRequestBody() {
-    return this.generatedRequestBody;
+  public void generate() {
+    if (httpParameterType == HttpParameterType.BODY) {
+      RequestBody requestBody = new RequestBody();
+      Map<String, Object> extensions = new HashMap<>();
+      extensions.put(SwaggerConst.EXT_BODY_NAME, parameterGeneratorContext.getParameterName());
+      requestBody.setExtensions(extensions);
+      requestBody.setContent(new Content());
+      for (String media : parameterGeneratorContext.getSupportedConsumes()) {
+        MediaType mediaType = new MediaType();
+        mediaType.setSchema(parameterGeneratorContext.getSchema());
+        requestBody.getContent().addMediaType(media, mediaType);
+      }
+      this.operationGenerator.getOperation().setRequestBody(requestBody);
+      return;
+    }
+    if (httpParameterType == HttpParameterType.FORM) {
+      RequestBody requestBody = this.operationGenerator.getOperation().getRequestBody();
+      if (requestBody == null) {
+        requestBody = new RequestBody();
+        requestBody.setContent(new Content());
+        this.operationGenerator.getOperation().setRequestBody(requestBody);
+      }
+      for (String media : parameterGeneratorContext.getSupportedConsumes()) {
+        MediaType mediaType = requestBody.getContent().get(media);
+        if (mediaType == null) {
+          mediaType = new MediaType();
+          requestBody.getContent().addMediaType(media, mediaType);
+        }
+        mediaType.getSchema().addProperty(parameterGeneratorContext.getParameterName(),
+            parameterGeneratorContext.getSchema());
+      }
+      return;
+    }
+    Parameter parameter;
+    switch (httpParameterType) {
+      case PATH -> parameter = new PathParameter();
+      case QUERY -> parameter = new QueryParameter();
+      case HEADER -> parameter = new HeaderParameter();
+      case COOKIE -> parameter = new CookieParameter();
+      default -> throw new IllegalStateException("not support httpParameterType " + httpParameterType);
+    }
+    parameter.setSchema(parameterGeneratorContext.getSchema());
+    parameter.setRequired(parameterGeneratorContext.getRequired());
+    parameter.setExplode(parameterGeneratorContext.getExplode());
+    parameter.setIn(httpParameterType.name());
+    this.operationGenerator.getOperation().addParametersItem(parameter);
+
+    // validations and other annotations supported by swagger default
+    if (parameterGeneratorContext.getParameterType() != null) {
+      io.swagger.v3.core.util.ParameterProcessor.applyAnnotations(parameter,
+          parameterGeneratorContext.getParameterType(),
+          annotations, operationGenerator.getSwagger().getComponents(),
+          null, null, null);
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
similarity index 76%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
index 3b0f5ecf4..7120040af 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterTypeProcessor.java
@@ -14,15 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
+package org.apache.servicecomb.swagger.generator;
 
 import java.lang.reflect.Type;
 
-import jakarta.ws.rs.PUT;
+public interface ParameterTypeProcessor {
+  Type getProcessType();
 
-public class PutAnnotationProcessor extends GetAnnotationProcessor {
-  @Override
-  public Type getProcessType() {
-    return PUT.class;
-  }
+  void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator);
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerConst.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerConst.java
index eb22a2823..5b26bea75 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerConst.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerConst.java
@@ -33,6 +33,8 @@ public final class SwaggerConst {
 
   public static final String FILE_MEDIA_TYPE = MediaType.MULTIPART_FORM_DATA;
 
+  public static final String PROTOBUF_TYPE = "application/protobuf";
+
   public static final String EXT_JAVA_INTF = "x-java-interface";
 
   public static final String EXT_JAVA_CLASS = "x-java-class";
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGenerator.java
index a925a9ea1..7cede372c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGenerator.java
@@ -20,6 +20,7 @@ import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,6 +47,8 @@ public interface SwaggerGenerator {
 
   SwaggerGeneratorFeature getSwaggerGeneratorFeature();
 
+  SwaggerGeneratorContext getSwaggerGeneratorContext();
+
   /**
    * support placeholder
    * @param basePath
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
index 6401d45b2..196b3b4e4 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
@@ -68,6 +68,12 @@ public final class SwaggerGeneratorUtils {
   private static final List<OperationPostProcessor> operationPostProcessors = SPIServiceUtils
       .getOrLoadSortedService(OperationPostProcessor.class);
 
+  private static final List<ParameterAnnotationProcessor> parameterAnnotationProcessors = SPIServiceUtils
+      .getOrLoadSortedService(ParameterAnnotationProcessor.class);
+
+  private static final List<ParameterTypeProcessor> parameterTypeProcessors = SPIServiceUtils
+      .getOrLoadSortedService(ParameterTypeProcessor.class);
+
   static {
     // low order value has high priority
     for (ClassAnnotationProcessor<?> processor : SPIServiceUtils
@@ -133,6 +139,26 @@ public final class SwaggerGeneratorUtils {
     return findParameterProcessors(TypeFactory.defaultInstance().constructType(type));
   }
 
+  @SuppressWarnings("unchecked")
+  public static ParameterAnnotationProcessor<Annotation> findParameterAnnotationProcessor(Type type) {
+    for (ParameterAnnotationProcessor<Annotation> processor : parameterAnnotationProcessors) {
+      if (processor.getProcessType() == type) {
+        return processor;
+      }
+    }
+    return null;
+  }
+
+  @SuppressWarnings("unchecked")
+  public static ParameterTypeProcessor findParameterTypeProcessor(Type type) {
+    for (ParameterTypeProcessor processor : parameterTypeProcessors) {
+      if (processor.getProcessType() == type) {
+        return processor;
+      }
+    }
+    return null;
+  }
+
   @SuppressWarnings("unchecked")
   public static <ANNOTATION> ParameterProcessor<ANNOTATION> findParameterProcessors(
       JavaType type) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerParameterAnnotationProcessor.java
similarity index 75%
copy from swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerParameterAnnotationProcessor.java
index 481d6845a..72633d01c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerParameterAnnotationProcessor.java
@@ -16,19 +16,10 @@
  */
 package org.apache.servicecomb.swagger.generator;
 
-
-import io.swagger.v3.oas.models.Operation;
-
-public interface OperationGenerator {
-  Operation getOperation();
-
-  void setHttpMethod(String httpMethod);
-
-  String getHttpMethod();
-
-  void addOperationToSwagger();
-
-  void setPath(String value);
-
-  void generateResponse();
+/**
+ * A generic class to help classify implementations. Processors of swagger annotations
+ * will implement this class.
+ */
+public abstract class SwaggerParameterAnnotationProcessor<ANNOTATION> implements
+    ParameterAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index 56d2bc4b8..a932c8258 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -18,7 +18,6 @@ package org.apache.servicecomb.swagger.generator.core;
 
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.collectAnnotations;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findMethodAnnotationProcessor;
-import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findParameterProcessors;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findResponseTypeProcessor;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.isContextParameter;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.postProcessOperation;
@@ -29,7 +28,6 @@ import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -44,10 +42,12 @@ import org.apache.servicecomb.config.inject.PlaceholderResolver;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.ParameterGenerator;
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
+import org.apache.servicecomb.swagger.generator.ParameterTypeProcessor;
 import org.apache.servicecomb.swagger.generator.ResponseTypeProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerConst;
+import org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 
@@ -65,11 +65,6 @@ import io.swagger.v3.oas.models.PathItem;
 import io.swagger.v3.oas.models.Paths;
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.CookieParameter;
-import io.swagger.v3.oas.models.parameters.HeaderParameter;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.PathParameter;
-import io.swagger.v3.oas.models.parameters.QueryParameter;
 import io.swagger.v3.oas.models.parameters.RequestBody;
 import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
@@ -95,6 +90,8 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
 
   protected RequestBody bodyParameter;
 
+  protected OperationGeneratorContext operationGeneratorContext;
+
   public AbstractOperationGenerator(AbstractSwaggerGenerator swaggerGenerator, Method method) {
     this.swaggerGenerator = swaggerGenerator;
     this.swagger = swaggerGenerator.getOpenAPI();
@@ -102,9 +99,15 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     this.method = method;
     this.httpMethod = swaggerGenerator.getHttpMethod();
 
+    operationGeneratorContext = new OperationGeneratorContext(swaggerGenerator.getSwaggerGeneratorContext());
     swaggerOperation = new Operation();
   }
 
+  @Override
+  public OperationGeneratorContext getOperationGeneratorContext() {
+    return operationGeneratorContext;
+  }
+
   @Override
   public void setHttpMethod(String httpMethod) {
     if (StringUtils.isEmpty(httpMethod)) {
@@ -114,6 +117,11 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     this.httpMethod = httpMethod.toUpperCase(Locale.US);
   }
 
+  @Override
+  public OpenAPI getSwagger() {
+    return this.swagger;
+  }
+
   @Override
   public String getHttpMethod() {
     return httpMethod;
@@ -176,20 +184,16 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     for (ParameterGenerator parameterGenerator : parameterGenerators) {
       scanMethodParameter(parameterGenerator);
 
-      if (!names.add(parameterGenerator.getParameterName())) {
+      if (!names.add(parameterGenerator.getParameterGeneratorContext().getParameterName())) {
         throw new IllegalStateException(
-            String.format("not support duplicated parameter, name=%s.", parameterGenerator.getParameterName()));
-      }
-      if (parameterGenerator.getGeneratedRequestBody() != null) {
-        swaggerOperation.setRequestBody(parameterGenerator.getGeneratedRequestBody());
-      }
-      if (parameterGenerator.getGeneratedParameter() != null) {
-        swaggerOperation.addParametersItem(parameterGenerator.getGeneratedParameter());
+            String.format("not support duplicated parameter, name=%s.",
+                parameterGenerator.getParameterGeneratorContext().getParameterName()));
       }
+      parameterGenerator.generate();
     }
   }
 
-  private void initParameterGenerators() {
+  protected void initParameterGenerators() {
     // 1.group method annotations by parameter name
     // key is parameter name
     Map<String, List<Annotation>> methodAnnotationMap = initMethodAnnotationByParameterName();
@@ -214,8 +218,8 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
       Type genericType = TypeToken.of(clazz)
           .resolveType(methodParameter.getParameterizedType())
           .getType();
-      ParameterGenerator parameterGenerator = new ParameterGenerator(method, methodAnnotationMap, methodParameter,
-          genericType);
+      ParameterGenerator parameterGenerator = new ParameterGenerator(
+          this, method, methodAnnotationMap, methodParameter, genericType);
       validateParameter(parameterGenerator.getGenericType());
       if (isContextParameter(parameterGenerator.getGenericType())) {
         continue;
@@ -247,7 +251,7 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
       }
 
       Annotation[] annotations = collectAnnotations(propertyDefinition);
-      ParameterGenerator propertyParameterGenerator = new ParameterGenerator(method,
+      ParameterGenerator propertyParameterGenerator = new ParameterGenerator(this, method,
           methodAnnotationMap,
           propertyDefinition.getName(),
           annotations,
@@ -258,7 +262,7 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
 
   protected void initRemainMethodAnnotationsParameterGenerators(Map<String, List<Annotation>> methodAnnotationMap) {
     for (Entry<String, List<Annotation>> entry : methodAnnotationMap.entrySet()) {
-      ParameterGenerator parameterGenerator = new ParameterGenerator(entry.getKey(), entry.getValue());
+      ParameterGenerator parameterGenerator = new ParameterGenerator(this, entry.getKey(), entry.getValue());
       parameterGenerators.add(parameterGenerator);
     }
   }
@@ -304,138 +308,26 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
   }
 
   protected void scanMethodParameter(ParameterGenerator parameterGenerator) {
-    if (!HttpParameterType.isBodyParameter(parameterGenerator.getHttpParameterType())) {
-      Parameter parameter = createParameter(parameterGenerator);
-
-      try {
-        fillParameter(swagger,
-            parameter,
-            parameterGenerator.getParameterName(),
-            parameterGenerator.getGenericType(),
-            parameterGenerator.getAnnotations());
-      } catch (Throwable e) {
-        throw new IllegalStateException(
-            String.format("failed to fill parameter, parameterName=%s.",
-                parameterGenerator.getParameterName()),
-            e);
-      }
-      return;
-    }
-
-    RequestBody requestBody = createRequestBody(parameterGenerator);
-
-    try {
-      fillRequestBody(swagger,
-          requestBody,
-          parameterGenerator.getParameterName(),
-          parameterGenerator.getGenericType(),
-          parameterGenerator.getAnnotations());
-    } catch (Throwable e) {
-      throw new IllegalStateException(
-          String.format("failed to fill parameter, parameterName=%s.",
-              parameterGenerator.getParameterName()),
-          e);
-    }
-  }
-
-  protected RequestBody createRequestBody(ParameterGenerator parameterGenerator) {
-    switch (parameterGenerator.getHttpParameterType()) {
-      case BODY -> {
-        if (this.bodyParameter != null) {
-          throw new IllegalStateException("Only one body parameter is allowed.");
-        }
-        this.bodyParameter = new RequestBody();
-        Map<String, Object> extensions = new HashMap<>();
-        extensions.put(SwaggerConst.EXT_BODY_NAME, parameterGenerator.getParameterName());
-        this.bodyParameter.setExtensions(extensions);
-        parameterGenerator.setGeneratedRequestBody(this.bodyParameter);
-        return this.bodyParameter;
-      }
-      case FORM -> {
-        if (this.bodyParameter == null) {
-          this.bodyParameter = new RequestBody();
-        }
-        parameterGenerator.setGeneratedRequestBody(this.bodyParameter);
-        return this.bodyParameter;
-      }
-      default -> throw new IllegalStateException(
-          "not support httpParameterType " + parameterGenerator.getHttpParameterType());
-    }
-  }
-
-  protected Parameter createParameter(ParameterGenerator parameterGenerator) {
-    Parameter parameter = createParameter(parameterGenerator.getHttpParameterType());
-    parameterGenerator.setGeneratedParameter(parameter);
-    parameterGenerator.getGeneratedParameter().setName(parameterGenerator.getParameterName());
-    return parameter;
-  }
-
-  protected Parameter createParameter(HttpParameterType httpParameterType) {
-    return switch (httpParameterType) {
-      case PATH -> new PathParameter();
-      case QUERY -> new QueryParameter();
-      case HEADER -> new HeaderParameter();
-      case COOKIE -> new CookieParameter();
-      default -> throw new IllegalStateException("not support httpParameterType " + httpParameterType);
-    };
-  }
-
-  protected void fillParameter(OpenAPI swagger, Parameter parameter, String parameterName, JavaType type,
-      List<Annotation> annotations) {
-    if (type != null) {
-      io.swagger.v3.core.util.ParameterProcessor.applyAnnotations(parameter, type, annotations, swagger.getComponents(),
-          null, null, null);
-    }
-
-    for (Annotation annotation : annotations) {
-      ParameterProcessor<Annotation> processor = findParameterProcessors(annotation.annotationType());
+    for (Annotation annotation : parameterGenerator.getAnnotations()) {
+      ParameterAnnotationProcessor<Annotation> processor = SwaggerGeneratorUtils
+          .findParameterAnnotationProcessor(annotation.annotationType());
       if (processor != null) {
-        processor.fillParameter(swagger, swaggerOperation, parameter, type, annotation);
+        processor.process(this.swaggerGenerator, this, parameterGenerator, annotation);
       }
     }
 
-    if (type == null) {
-      return;
-    }
-
-    ParameterProcessor<Annotation> processor = findParameterProcessors(type);
-    if (processor != null) {
-      processor.fillParameter(swagger, swaggerOperation, parameter, type, null);
-    }
-  }
-
-  protected void fillRequestBody(OpenAPI swagger, RequestBody parameter, String parameterName, JavaType type,
-      List<Annotation> annotations) {
-    for (Annotation annotation : annotations) {
-      ParameterProcessor<Annotation> processor = findParameterProcessors(annotation.annotationType());
-      if (processor != null) {
-        processor.fillRequestBody(swagger, swaggerOperation, parameter, parameterName, type, annotation);
+    Schema<?> schema = parameterGenerator.getParameterGeneratorContext().getSchema();
+    if (schema == null) {
+      JavaType parameterType = parameterGenerator.getParameterGeneratorContext().getParameterType();
+      if (parameterType == null) {
+        parameterType = parameterGenerator.getGenericType();
       }
-    }
-
-    if (type == null) {
-      return;
-    }
-
-    ParameterProcessor<Annotation> processor = findParameterProcessors(type);
-    if (processor != null) {
-      processor.fillRequestBody(swagger, swaggerOperation, parameter, parameterName, type, null);
-    }
-
-    fillBodyParameter(swagger, parameter, type);
-  }
-
-  private void fillBodyParameter(OpenAPI swagger, RequestBody parameter, Type type) {
-    if (parameter.getContent() == null) {
-      parameter.setContent(new Content());
-    }
-    if (parameter.getContent().size() == 0) {
-      parameter.getContent()
-          .addMediaType(SwaggerConst.DEFAULT_MEDIA_TYPE, new io.swagger.v3.oas.models.media.MediaType());
-    }
-    for (io.swagger.v3.oas.models.media.MediaType mediaType : parameter.getContent().values()) {
-      if (mediaType.getSchema() == null) {
-        mediaType.schema(SwaggerUtils.resolveTypeSchemas(swagger, type));
+      ParameterTypeProcessor processor = SwaggerGeneratorUtils.findParameterTypeProcessor(parameterType);
+      if (processor != null) {
+        processor.process(this.swaggerGenerator, this, parameterGenerator);
+      } else {
+        parameterGenerator.getParameterGeneratorContext().setSchema(SwaggerUtils.resolveTypeSchemas(this.swagger,
+            parameterType));
       }
     }
   }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
index 3f6e3e0b1..a74a9feda 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
@@ -59,6 +59,8 @@ import io.swagger.v3.oas.models.servers.Server;
 public abstract class AbstractSwaggerGenerator implements SwaggerGenerator {
   protected SwaggerGeneratorFeature swaggerGeneratorFeature = new SwaggerGeneratorFeature();
 
+  protected SwaggerGeneratorContext swaggerGeneratorContext = new SwaggerGeneratorContext();
+
   protected Class<?> cls;
 
   protected OpenAPI openAPI;
@@ -100,10 +102,16 @@ public abstract class AbstractSwaggerGenerator implements SwaggerGenerator {
     this.httpMethod = httpMethod.toUpperCase(Locale.US);
   }
 
+  @Override
   public SwaggerGeneratorFeature getSwaggerGeneratorFeature() {
     return swaggerGeneratorFeature;
   }
 
+  @Override
+  public SwaggerGeneratorContext getSwaggerGeneratorContext() {
+    return swaggerGeneratorContext;
+  }
+
   public OpenAPI generate() {
     LOGGER.info("generate schema from [{}]", cls);
     scanClassAnnotation();
@@ -143,10 +151,6 @@ public abstract class AbstractSwaggerGenerator implements SwaggerGenerator {
    * if can not build default value, then throw exceptions
    */
   protected void correctSwagger() {
-    if (StringUtils.isEmpty(openAPI.getOpenapi())) {
-      openAPI.setOpenapi("3.0.0");
-    }
-
     correctBasePath();
     correctInfo();
   }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
similarity index 74%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
index 3b0f5ecf4..650cb11f1 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGeneratorContext.java
@@ -14,15 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
+package org.apache.servicecomb.swagger.generator.core;
 
-import java.lang.reflect.Type;
-
-import jakarta.ws.rs.PUT;
-
-public class PutAnnotationProcessor extends GetAnnotationProcessor {
-  @Override
-  public Type getProcessType() {
-    return PUT.class;
+public class OperationGeneratorContext extends SwaggerGeneratorContext {
+  public OperationGeneratorContext(SwaggerGeneratorContext parent) {
+    super(parent);
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
new file mode 100644
index 000000000..09364a0f7
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.swagger.generator.core;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.swagger.v3.oas.models.media.Schema;
+
+public class ParameterGeneratorContext extends OperationGeneratorContext {
+  private JavaType parameterType;
+
+  private String parameterName;
+
+  private Boolean explode;
+
+  private Boolean required;
+
+  private Boolean rawJson;
+
+  private Schema<?> schema;
+
+  public ParameterGeneratorContext(OperationGeneratorContext parent) {
+    super(parent);
+  }
+
+  public JavaType getParameterType() {
+    return parameterType;
+  }
+
+  public void setParameterType(JavaType parameterType) {
+    this.parameterType = parameterType;
+  }
+
+  public String getParameterName() {
+    return parameterName;
+  }
+
+  public void setParameterName(String parameterName) {
+    this.parameterName = parameterName;
+  }
+
+  public Boolean getExplode() {
+    return explode;
+  }
+
+  public void setExplode(Boolean explode) {
+    this.explode = explode;
+  }
+
+  public Boolean getRequired() {
+    return required;
+  }
+
+  public void setRequired(Boolean required) {
+    this.required = required;
+  }
+
+  public Boolean getRawJson() {
+    return rawJson;
+  }
+
+  public void setRawJson(Boolean rawJson) {
+    this.rawJson = rawJson;
+  }
+
+  public Schema<?> getSchema() {
+    return schema;
+  }
+
+  public void setSchema(Schema<?> schema) {
+    this.schema = schema;
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
new file mode 100644
index 000000000..10806dab8
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.swagger.generator.core;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
+
+import jakarta.ws.rs.core.MediaType;
+
+/**
+ * Context information to help generate specific open api parts.
+ */
+public class SwaggerGeneratorContext {
+  // TODO: may initialized by different codec implementations
+  protected static final List<String> SUPPORTED_CONTENT_TYPE
+      = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN,
+      MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_FORM_URLENCODED);
+
+  protected List<String> supportedConsumes;
+
+  protected List<String> supportedProduces;
+
+  public SwaggerGeneratorContext() {
+    supportedConsumes = new ArrayList<>();
+    supportedConsumes.addAll(SUPPORTED_CONTENT_TYPE);
+    supportedProduces = new ArrayList<>();
+    supportedProduces.addAll(SUPPORTED_CONTENT_TYPE);
+  }
+
+  public SwaggerGeneratorContext(SwaggerGeneratorContext parent) {
+    supportedConsumes = new ArrayList<>();
+    supportedConsumes.addAll(parent.supportedConsumes);
+    supportedProduces = new ArrayList<>();
+    supportedProduces.addAll(parent.supportedProduces);
+  }
+
+  public void updateProduces(List<String> produces) {
+    checkMediaTypeValid(produces);
+    supportedProduces.clear();
+    supportedProduces.addAll(produces);
+  }
+
+  public void updateConsumes(List<String> consumes) {
+    checkMediaTypeValid(consumes);
+    supportedConsumes.clear();
+    supportedConsumes.addAll(consumes);
+  }
+
+  public List<String> getSupportedConsumes() {
+    return supportedConsumes;
+  }
+
+  public List<String> getSupportedProduces() {
+    return supportedProduces;
+  }
+
+  private void checkMediaTypeValid(List<String> produces) {
+    for (String produce : produces) {
+      if (!SUPPORTED_CONTENT_TYPE.contains(produce)) {
+        throw new IllegalArgumentException("Not support media type " + produce);
+      }
+    }
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
index 242013aff..6d00f0d6b 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessor.java
@@ -39,7 +39,9 @@ public class OperationMethodAnnotationProcessor implements MethodAnnotationProce
     io.swagger.v3.oas.models.Operation specificOperation =
         AnnotationUtils.operationModel(swaggerGenerator.getOpenAPI(), apiOperationAnnotation);
 
-    operationGenerator.setHttpMethod(apiOperationAnnotation.method());
+    if (!StringUtils.isEmpty(apiOperationAnnotation.method())) {
+      operationGenerator.setHttpMethod(apiOperationAnnotation.method());
+    }
 
     if (!StringUtils.isEmpty(specificOperation.getSummary())) {
       operation.setSummary(specificOperation.getSummary());
@@ -57,10 +59,6 @@ public class OperationMethodAnnotationProcessor implements MethodAnnotationProce
       operation.setExtensions(specificOperation.getExtensions());
     }
 
-    if (specificOperation.getRequestBody() != null) {
-      operation.setRequestBody(specificOperation.getRequestBody());
-    }
-
     if (!CollectionUtils.isEmpty(specificOperation.getTags())) {
       operation.setTags(specificOperation.getTags());
     }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
index 57603c12a..2fa5a596c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
@@ -16,26 +16,10 @@
  */
 package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
-import static org.apache.servicecomb.swagger.extend.SwaggerEnum.DYNAMIC;
-import static org.apache.servicecomb.swagger.extend.SwaggerEnum.JDK;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.foundation.common.base.DynamicEnum;
-import org.apache.servicecomb.swagger.extend.SwaggerEnum;
 import org.apache.servicecomb.swagger.generator.OperationPostProcessor;
-import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 import org.apache.servicecomb.swagger.generator.core.AbstractOperationGenerator;
 import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-
-import io.swagger.v3.oas.models.parameters.Parameter;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response.Status;
-
 public class EnumPostProcessor implements OperationPostProcessor {
   @Override
   public boolean shouldProcess(AbstractSwaggerGenerator swaggerGenerator,
@@ -45,49 +29,50 @@ public class EnumPostProcessor implements OperationPostProcessor {
 
   @Override
   public void process(AbstractSwaggerGenerator swaggerGenerator, AbstractOperationGenerator operationGenerator) {
-    for (ParameterGenerator parameterGenerator : operationGenerator.getParameterGenerators()) {
-      if (parameterGenerator.getGeneratedParameter() != null) {
-        processParameterDescription(parameterGenerator);
-      }
-    }
-
-    processResponseModelDescription(operationGenerator);
-  }
-
-  private void processParameterDescription(ParameterGenerator parameterGenerator) {
-    JavaType genericType = parameterGenerator.getGenericType();
-    Annotation[] annotations = parameterGenerator.getAnnotations().toArray(new Annotation[0]);
-    String description = generateDescription(genericType, annotations);
-    if (description != null) {
-      Parameter parameter = parameterGenerator
-          .getGeneratedParameter();
-      parameter.setDescription(description);
-    }
+    // TODO: dynamic enum tests
+//    for (ParameterGenerator parameterGenerator : operationGenerator.getParameterGenerators()) {
+//      if (parameterGenerator.getGeneratedParameter() != null) {
+//        processParameterDescription(parameterGenerator);
+//      }
+//    }
+//
+//    processResponseModelDescription(operationGenerator);
   }
 
-  private String generateDescription(Type type, Annotation[] annotations) {
-    JavaType javaType = TypeFactory.defaultInstance().constructType(type);
-    if (javaType.isEnumType()) {
-      return generateDescription(JDK, javaType.getRawClass(), annotations);
-    }
-
-    if (javaType.isTypeOrSubTypeOf(DynamicEnum.class)) {
-      return generateDescription(DYNAMIC, javaType.getRawClass(), annotations);
-    }
-
-    return null;
-  }
-
-  private String generateDescription(SwaggerEnum swaggerEnum, Class<?> enumClass, Annotation[] annotations) {
-    return swaggerEnum.findPropertyDescription(enumClass, annotations);
-  }
-
-  public void processResponseModelDescription(AbstractOperationGenerator operationGenerator) {
-    String description = generateDescription(operationGenerator.getMethod().getReturnType(), null);
-    if (description != null) {
-      operationGenerator.getOperation().getResponses().get(String.valueOf(Status.OK.getStatusCode()))
-          .getContent().get(MediaType.APPLICATION_JSON).getSchema()
-          .setDescription(description);
-    }
-  }
+//  private void processParameterDescription(ParameterGenerator parameterGenerator) {
+//    JavaType genericType = parameterGenerator.getGenericType();
+//    Annotation[] annotations = parameterGenerator.getAnnotations().toArray(new Annotation[0]);
+//    String description = generateDescription(genericType, annotations);
+//    if (description != null) {
+//      Parameter parameter = parameterGenerator
+//          .getGeneratedParameter();
+//      parameter.setDescription(description);
+//    }
+//  }
+//
+//  private String generateDescription(Type type, Annotation[] annotations) {
+//    JavaType javaType = TypeFactory.defaultInstance().constructType(type);
+//    if (javaType.isEnumType()) {
+//      return generateDescription(JDK, javaType.getRawClass(), annotations);
+//    }
+//
+//    if (javaType.isTypeOrSubTypeOf(DynamicEnum.class)) {
+//      return generateDescription(DYNAMIC, javaType.getRawClass(), annotations);
+//    }
+//
+//    return null;
+//  }
+//
+//  private String generateDescription(SwaggerEnum swaggerEnum, Class<?> enumClass, Annotation[] annotations) {
+//    return swaggerEnum.findPropertyDescription(enumClass, annotations);
+//  }
+//
+//  public void processResponseModelDescription(AbstractOperationGenerator operationGenerator) {
+//    String description = generateDescription(operationGenerator.getMethod().getReturnType(), null);
+//    if (description != null) {
+//      operationGenerator.getOperation().getResponses().get(String.valueOf(Status.OK.getStatusCode()))
+//          .getContent().get(MediaType.APPLICATION_JSON).getSchema()
+//          .setDescription(description);
+//    }
+//  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/JsonViewProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/JsonViewProcessor.java
deleted file mode 100644
index f2db13530..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/JsonViewProcessor.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-
-import com.fasterxml.jackson.annotation.JsonView;
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-
-public class JsonViewProcessor implements ParameterProcessor<Annotation> {
-
-  @Override
-  public Type getProcessType() {
-    return JsonView.class;
-  }
-
-  @Override
-  public String getParameterName(Annotation parameterAnnotation) {
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(Annotation parameterAnnotation) {
-    return null;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      Annotation annotation) {
-    if (!(annotation instanceof JsonView)) {
-      throw new IllegalArgumentException(
-          "JsonViewProcessor only support process parameter with annotation @JsonView");
-    }
-    Class<?>[] jvValue = ((JsonView) annotation).value();
-    if (jvValue.length != 1) {
-      throw new IllegalArgumentException(
-          "@JsonView only supported for exactly 1 class argument ");
-    }
-//    parameter.getVendorExtensions().put(SwaggerConst.EXT_JSON_VIEW, jvValue[0].getName());
-    // TODO: not complete
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter, String parameterName,
-      JavaType type, Annotation annotation) {
-
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
new file mode 100644
index 000000000..c4b549095
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterAnnotationProcessor.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.swagger.generator.core.processor.parameter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor;
+import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
+
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import io.swagger.v3.oas.annotations.enums.Explode;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+
+public class ParameterParameterAnnotationProcessor
+    extends SwaggerParameterAnnotationProcessor<io.swagger.v3.oas.annotations.Parameter> {
+  @Override
+  public Class<?> getProcessType() {
+    return io.swagger.v3.oas.annotations.Parameter.class;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, io.swagger.v3.oas.annotations.Parameter annotation) {
+    if (annotation.schema() != null
+        && annotation.schema().implementation() != null
+        && annotation.schema().implementation() != Void.class) {
+      parameterGenerator.getParameterGeneratorContext()
+          .setParameterType(TypeFactory.defaultInstance().constructType(annotation.schema().implementation()));
+    }
+
+    if (StringUtils.isNotEmpty(annotation.name())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.name());
+    }
+
+    if (annotation.in() != null && annotation.in() != ParameterIn.DEFAULT) {
+      parameterGenerator.setHttpParameterType(HttpParameterType.from(annotation.in()));
+    }
+
+    if (Explode.TRUE.equals(annotation.explode())) {
+      parameterGenerator.getParameterGeneratorContext().setExplode(true);
+    }
+    if (Explode.FALSE.equals(annotation.explode())) {
+      parameterGenerator.getParameterGeneratorContext().setExplode(false);
+    }
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterProcessor.java
deleted file mode 100644
index cb7bb8070..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/ParameterParameterProcessor.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.annotations.enums.Explode;
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-@SuppressWarnings("rawtypes")
-public class ParameterParameterProcessor implements ParameterProcessor<io.swagger.v3.oas.annotations.Parameter> {
-  @Override
-  public Class<?> getProcessType() {
-    return io.swagger.v3.oas.annotations.Parameter.class;
-  }
-
-  @Override
-  public Type getGenericType(io.swagger.v3.oas.annotations.Parameter parameterAnnotation) {
-    if (parameterAnnotation.schema() == null) {
-      return null;
-    }
-
-    if (parameterAnnotation.schema().implementation() != Void.class
-        && parameterAnnotation.schema().implementation() != null) {
-      return parameterAnnotation.schema().implementation();
-    }
-    return null;
-  }
-
-  @Override
-  public String getParameterName(io.swagger.v3.oas.annotations.Parameter parameterAnnotation) {
-    return parameterAnnotation.name();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(io.swagger.v3.oas.annotations.Parameter annotation) {
-    return HttpParameterType.from(annotation.in());
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      io.swagger.v3.oas.annotations.Parameter annotation) {
-    Schema schema = parameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      parameter.setSchema(schema);
-    }
-    parameter.setExplode(Explode.TRUE.equals(annotation.explode()));
-    parameter.setRequired(annotation.required());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter,
-      String parameterName, JavaType type, io.swagger.v3.oas.annotations.Parameter parameter2) {
-
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
similarity index 67%
copy from swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
index e736944ef..cedbfe038 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
@@ -17,15 +17,21 @@
 package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
 import java.lang.reflect.Type;
-import java.util.List;
 
-import jakarta.servlet.http.Part;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 
-import com.google.inject.util.Types;
+import io.swagger.v3.oas.models.media.ArraySchema;
+import io.swagger.v3.oas.models.media.FileSchema;
+import jakarta.servlet.http.Part;
 
-public class PartListProcessor extends PartArrayProcessor {
+public class PartArrayParameterTypeProcessor extends PartParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return Types.newParameterizedType(List.class, Part.class);
+    return Part[].class;
+  }
+
+  @Override
+  protected void formParameterSchema(ParameterGenerator parameterGenerator) {
+    parameterGenerator.getParameterGeneratorContext().setSchema(new ArraySchema().items(new FileSchema()));
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayProcessor.java
deleted file mode 100644
index f8bcea14d..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayProcessor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.ArraySchema;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.FileSchema;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-import jakarta.servlet.http.Part;
-
-@SuppressWarnings("unchecked")
-public class PartArrayProcessor implements ParameterProcessor<Annotation> {
-  @Override
-  public Type getProcessType() {
-    return Part[].class;
-  }
-
-  @Override
-  public String getParameterName(Annotation parameterAnnotation) {
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(Annotation parameterAnnotation) {
-    return HttpParameterType.FORM;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      Annotation annotation) {
-
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, Annotation annotation) {
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE) == null) {
-      requestBody.getContent().addMediaType(SwaggerConst.FILE_MEDIA_TYPE,
-          new io.swagger.v3.oas.models.media.MediaType());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema() == null) {
-      Schema<?> schema = new Schema<>();
-      schema.setProperties(new HashMap<>());
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE)
-          .setSchema(schema);
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema()
-        .getProperties().get(parameterName) == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema()
-          .getProperties().put(parameterName, new ArraySchema().items(new FileSchema()));
-    }
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java
rename to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
index e736944ef..cb4eeb39a 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
@@ -19,11 +19,11 @@ package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 import java.lang.reflect.Type;
 import java.util.List;
 
-import jakarta.servlet.http.Part;
-
 import com.google.inject.util.Types;
 
-public class PartListProcessor extends PartArrayProcessor {
+import jakarta.servlet.http.Part;
+
+public class PartListParameterTypeProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
     return Types.newParameterizedType(List.class, Part.class);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
new file mode 100644
index 000000000..9605db3f0
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.swagger.generator.core.processor.parameter;
+
+import java.lang.reflect.Type;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterTypeProcessor;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
+
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.FileSchema;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.parameters.RequestBody;
+import jakarta.servlet.http.Part;
+import jakarta.ws.rs.core.MediaType;
+
+public class PartParameterTypeProcessor implements ParameterTypeProcessor {
+  @Override
+  public Type getProcessType() {
+    return Part.class;
+  }
+
+  @Override
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator) {
+    if (!parameterGenerator.getParameterGeneratorContext().getSupportedConsumes()
+        .contains(MediaType.MULTIPART_FORM_DATA)) {
+      throw new IllegalArgumentException("Part type must declare consumes " + MediaType.MULTIPART_FORM_DATA);
+    }
+    if (parameterGenerator.getHttpParameterType() != HttpParameterType.FORM) {
+      throw new IllegalArgumentException("Part type must declare as form parameter.");
+    }
+    if (StringUtils.isEmpty(parameterGenerator.getParameterGeneratorContext().getParameterName())) {
+      throw new IllegalArgumentException("Name is required for Part parameter.");
+    }
+    parameterGenerator.getParameterGeneratorContext().updateConsumes(List.of(MediaType.MULTIPART_FORM_DATA));
+
+    formParameterSchema(parameterGenerator);
+  }
+
+  protected void formParameterSchema(ParameterGenerator parameterGenerator) {
+    parameterGenerator.getParameterGeneratorContext().setSchema(new FileSchema());
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartProcessor.java
deleted file mode 100644
index 015a511d3..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartProcessor.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.LinkedHashMap;
-
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.FileSchema;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-import jakarta.servlet.http.Part;
-
-@SuppressWarnings({"unchecked"})
-public class PartProcessor implements ParameterProcessor<Annotation> {
-  @Override
-  public Type getProcessType() {
-    return Part.class;
-  }
-
-  @Override
-  public String getParameterName(Annotation parameterAnnotation) {
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(Annotation parameterAnnotation) {
-    return HttpParameterType.FORM;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      Annotation annotation) {
-
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody,
-      String parameterName, JavaType type,
-      Annotation annotation) {
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE) == null) {
-      requestBody.getContent().addMediaType(SwaggerConst.FILE_MEDIA_TYPE,
-          new io.swagger.v3.oas.models.media.MediaType());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema() == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE)
-          .setSchema(new Schema<>());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema().getProperties() == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema().setProperties(new LinkedHashMap<>());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema()
-        .getProperties().get(parameterName) == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema()
-          .getProperties().put(parameterName, new FileSchema());
-    }
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
index 60ad72036..0900ffe96 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RawJsonRequestBodyProcessor.java
@@ -19,49 +19,31 @@ package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.extend.annotations.RawJsonRequestBody;
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-public class RawJsonRequestBodyProcessor implements ParameterProcessor<RawJsonRequestBody> {
+public class RawJsonRequestBodyProcessor extends
+    SwaggerParameterAnnotationProcessor<RawJsonRequestBody> {
   @Override
   public Class<?> getProcessType() {
     return RawJsonRequestBody.class;
   }
 
   @Override
-  public String getParameterName(RawJsonRequestBody rawJsonRequestBody) {
-    if (StringUtils.isNotEmpty(rawJsonRequestBody.value())) {
-      return rawJsonRequestBody.value();
-    }
-    if (StringUtils.isNotEmpty(rawJsonRequestBody.name())) {
-      return rawJsonRequestBody.name();
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RawJsonRequestBody annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
+
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
+    } else if (StringUtils.isNotEmpty(annotation.name())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.name());
     }
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RawJsonRequestBody parameterAnnotation) {
-    return HttpParameterType.BODY;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      RawJsonRequestBody rawJsonRequestBody) {
 
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter,
-      String parameterName, JavaType type,
-      RawJsonRequestBody annotation) {
-    parameter.getExtensions().put("x-raw-json", true);
-    parameter.setRequired(annotation.required());
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
+    parameterGenerator.getParameterGeneratorContext().setRawJson(true);
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
similarity index 56%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
copy to swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
index dd96bfeb4..5394bf3c6 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterAnnotationProcessor.java
@@ -15,26 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
+package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor;
+import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import jakarta.ws.rs.Consumes;
-
-public class ConsumesAnnotationProcessor implements MethodAnnotationProcessor<Consumes> {
+public class RequestBodyParameterAnnotationProcessor extends
+    SwaggerParameterAnnotationProcessor<io.swagger.v3.oas.annotations.parameters.RequestBody> {
   @Override
-  public Type getProcessType() {
-    return Consumes.class;
+  public Class<?> getProcessType() {
+    return io.swagger.v3.oas.annotations.parameters.RequestBody.class;
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator, Consumes consumes) {
-    // TODO: actually is no use to update consumes and produces
-    // Because they are system capabilities.
-//    SwaggerUtils.updateConsumes(operationGenerator.getOperation(), consumes.value());
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, io.swagger.v3.oas.annotations.parameters.RequestBody annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterProcessor.java
deleted file mode 100644
index d859e6411..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/RequestBodyParameterProcessor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
-import org.apache.servicecomb.swagger.generator.core.processor.annotation.AnnotationUtils;
-
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-import jakarta.ws.rs.core.MediaType;
-
-public class RequestBodyParameterProcessor implements
-    ParameterProcessor<io.swagger.v3.oas.annotations.parameters.RequestBody> {
-  @Override
-  public Class<?> getProcessType() {
-    return io.swagger.v3.oas.annotations.parameters.RequestBody.class;
-  }
-
-  @Override
-  public String getParameterName(io.swagger.v3.oas.annotations.parameters.RequestBody requestBody) {
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(
-      io.swagger.v3.oas.annotations.parameters.RequestBody requestBody) {
-    return HttpParameterType.BODY;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      io.swagger.v3.oas.annotations.parameters.RequestBody requestBody) {
-
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter,
-      String parameterName, JavaType type,
-      io.swagger.v3.oas.annotations.parameters.RequestBody annotation) {
-    // create a new request body
-    RequestBody requestBody = AnnotationUtils.requestBodyModel(swagger, annotation);
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
-    }
-    if (requestBody.getContent().size() == 0) {
-      requestBody.getContent().addMediaType(MediaType.APPLICATION_JSON,
-          new io.swagger.v3.oas.models.media.MediaType().schema(SwaggerUtils.resolveTypeSchemas(swagger, type)));
-    } else {
-      requestBody.getContent().forEach((s, mediaType) -> {
-        if (mediaType.getSchema() == null) {
-          mediaType.setSchema(SwaggerUtils.resolveTypeSchemas(swagger, type));
-        }
-      });
-    }
-
-    // file request body by new
-    if (requestBody.getExtensions() != null) {
-      parameter.setExtensions(requestBody.getExtensions());
-    }
-    if (requestBody.getRequired() != null) {
-      parameter.setRequired(requestBody.getRequired());
-    }
-    if (requestBody.get$ref() != null) {
-      parameter.set$ref(requestBody.get$ref());
-    }
-    parameter.setContent(requestBody.getContent());
-  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
index 2f8786bc6..d2d4cf1e0 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
@@ -16,156 +16,87 @@
  */
 package org.apache.servicecomb.swagger.generator.pojo;
 
-import java.lang.annotation.Annotation;
+import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.isContextParameter;
+
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.ParameterGenerator;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.core.AbstractOperationGenerator;
 import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 
-import com.fasterxml.jackson.databind.JavaType;
+import com.google.common.reflect.TypeToken;
 
 import io.swagger.v3.oas.models.Components;
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.ObjectSchema;
 import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.HttpMethod;
 
-@SuppressWarnings("rawtypes")
 public class PojoOperationGenerator extends AbstractOperationGenerator {
-  private boolean isWrapBody = false;
-
-  protected Schema bodyModel;
-
   public PojoOperationGenerator(AbstractSwaggerGenerator swaggerGenerator, Method method) {
     super(swaggerGenerator, method);
   }
 
   @Override
-  protected void initMethodParameterGenerators(Map<String, List<Annotation>> methodAnnotationMap) {
-    super.initMethodParameterGenerators(methodAnnotationMap);
-
-    tryWrapParametersToBody();
-  }
-
-  private void initRequestBody(Schema schema, String bodyName) {
-    if (this.swaggerOperation.getRequestBody() != null) {
-      this.bodyParameter = this.swaggerOperation.getRequestBody();
-      if (this.bodyParameter.getContent() == null) {
-        this.bodyParameter.setContent(new Content());
-      }
-      if (this.bodyParameter.getContent().size() == 0) {
-        this.bodyParameter.getContent().addMediaType(SwaggerConst.DEFAULT_MEDIA_TYPE,
-            new MediaType());
+  protected void initParameterGenerators() {
+    List<ParameterGenerator> bodyParameters = new ArrayList<>();
+    for (java.lang.reflect.Parameter methodParameter : method.getParameters()) {
+      Type type = TypeToken.of(clazz)
+          .resolveType(methodParameter.getParameterizedType())
+          .getType();
+      ParameterGenerator parameterGenerator = new ParameterGenerator(
+          this, method, Collections.emptyMap(), methodParameter, type);
+      validateParameter(parameterGenerator.getGenericType());
+      if (isContextParameter(parameterGenerator.getGenericType())) {
+        continue;
       }
-    } else {
-      this.bodyParameter = new RequestBody().content(new Content().addMediaType(SwaggerConst.DEFAULT_MEDIA_TYPE,
-          new MediaType()));
+
+      bodyParameters.add(parameterGenerator);
     }
-    bodyParameter.getContent().forEach((k, v) -> v.setSchema(schema));
-    Map<String, Object> extensions = new HashMap<>();
-    extensions.put(SwaggerConst.EXT_BODY_NAME, bodyName);
-    bodyParameter.setExtensions(extensions);
+
+    tryWrapParametersToBody(bodyParameters);
   }
 
-  private void tryWrapParametersToBody() {
-    List<ParameterGenerator> bodyFields = parameterGenerators.stream().filter(pg -> pg.getHttpParameterType() == null)
-        .collect(Collectors.toList());
-    if (bodyFields.isEmpty()) {
+  private void tryWrapParametersToBody(List<ParameterGenerator> bodyParameters) {
+    if (bodyParameters.size() == 0) {
       return;
     }
 
-    if (bodyFields.size() == 1 && SwaggerUtils.isBean(bodyFields.get(0).getGenericType())) {
-      ParameterGenerator parameterGenerator = bodyFields.get(0);
+    if (bodyParameters.size() == 1 && SwaggerUtils.isBean(bodyParameters.get(0).getGenericType())) {
+      ParameterGenerator parameterGenerator = bodyParameters.get(0);
       parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
-      initRequestBody(SwaggerUtils.resolveTypeSchemas(swagger, parameterGenerator.getGenericType()),
-          parameterGenerator.getParameterName());
-      parameterGenerator.setGeneratedRequestBody(bodyParameter);
+      parameterGenerators.add(parameterGenerator);
       return;
     }
 
-    // wrap parameters to body
-    wrapParametersToBody(bodyFields);
+    wrapParametersToBody(bodyParameters);
   }
 
   private void wrapParametersToBody(List<ParameterGenerator> bodyFields) {
-    isWrapBody = true;
     String simpleRef = MethodUtils.findSwaggerMethodName(method) + "Body";
 
-    bodyModel = new Schema();
-    bodyModel.setType("object");
-
+    Schema<?> bodyModel = new ObjectSchema();
     for (ParameterGenerator parameterGenerator : bodyFields) {
-      // to collect all information by swagger mechanism
-      // must have a parameter type
-      // but all these parameters will be wrap to be one body parameter, their parameter type must be null
-      // so we first set to be BODY, after collected, set back to be null
-      parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
-      scanMethodParameter(parameterGenerator);
-
-      bodyModel.addProperty(parameterGenerator.getParameterName(),
+      bodyModel.addProperty(parameterGenerator.getParameterGeneratorContext().getParameterName(),
           SwaggerUtils.resolveTypeSchemas(swagger, parameterGenerator.getGenericType()));
-      parameterGenerator.setHttpParameterType(null);
     }
 
-    if (swagger.getComponents() == null) {
-      swagger.setComponents(new Components());
-    }
+    ParameterGenerator newParameterGenerator = new ParameterGenerator(this, simpleRef);
+    newParameterGenerator.getParameterGeneratorContext().setParameterName(simpleRef);
+    newParameterGenerator.setHttpParameterType(HttpParameterType.BODY);
+    parameterGenerators.add(newParameterGenerator);
+
     swagger.getComponents().addSchemas(simpleRef, bodyModel);
-    Schema bodyModelNew = new Schema();
+    Schema<?> bodyModelNew = new Schema<>();
     bodyModelNew.set$ref(Components.COMPONENTS_SCHEMAS_REF + simpleRef);
-
-    initRequestBody(bodyModelNew, simpleRef);
-
-    List<ParameterGenerator> newParameterGenerators = new ArrayList<>();
-    ParameterGenerator newParameterGenerator = new ParameterGenerator(
-        null,
-        Collections.emptyList(),
-        null,
-        HttpParameterType.BODY,
-        bodyParameter);
-    newParameterGenerator.setGeneratedRequestBody(bodyParameter);
-    newParameterGenerators.add(newParameterGenerator);
-    parameterGenerators.stream().filter(p -> p.getHttpParameterType() != null)
-        .forEach(newParameterGenerators::add);
-    parameterGenerators = newParameterGenerators;
-  }
-
-  @Override
-  protected void fillParameter(OpenAPI swagger, Parameter parameter, String parameterName, JavaType type,
-      List<Annotation> annotations) {
-    if (isWrapBody) {
-      return;
-    }
-
-    super.fillParameter(swagger, parameter, parameterName, type, annotations);
-  }
-
-  @Override
-  protected Parameter createParameter(ParameterGenerator parameterGenerator) {
-    return super.createParameter(parameterGenerator);
-  }
-
-  @Override
-  protected RequestBody createRequestBody(ParameterGenerator parameterGenerator) {
-    if (bodyParameter != null) {
-      return bodyParameter;
-    }
-    return super.createRequestBody(parameterGenerator);
+    newParameterGenerator.getParameterGeneratorContext().setSchema(bodyModelNew);
   }
 
   @Override
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
index 613139b28..f82c40ec1 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoSwaggerGenerator.java
@@ -17,13 +17,23 @@
 package org.apache.servicecomb.swagger.generator.pojo;
 
 import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
 
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 
+import jakarta.ws.rs.core.MediaType;
+
 public class PojoSwaggerGenerator extends AbstractSwaggerGenerator {
+  protected static final List<String> SUPPORTED_CONTENT_TYPE
+      = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE);
+
   public PojoSwaggerGenerator(Class<?> cls) {
     super(cls);
+    swaggerGeneratorContext.updateConsumes(SUPPORTED_CONTENT_TYPE);
+    swaggerGeneratorContext.updateProduces(SUPPORTED_CONTENT_TYPE);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
similarity index 69%
rename from swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
rename to swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
index 30ca80d26..7f737a6ff 100644
--- a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
+++ b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterTypeProcessor
@@ -15,10 +15,7 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.core.processor.parameter.ParameterParameterProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.RawJsonRequestBodyProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.RequestBodyParameterProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.PartProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.PartListProcessor
-org.apache.servicecomb.swagger.generator.core.processor.parameter.JsonViewProcessor
+org.apache.servicecomb.swagger.generator.core.processor.parameter.PartParameterTypeProcessor
+org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor
+org.apache.servicecomb.swagger.generator.core.processor.parameter.PartListParameterTypeProcessor
+
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor
similarity index 72%
copy from swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
copy to swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor
index 793163da1..be1aa8c99 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
+++ b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor
@@ -15,4 +15,6 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathClassAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.core.processor.parameter.RequestBodyParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.core.processor.parameter.ParameterParameterAnnotationProcessor
+org.apache.servicecomb.swagger.generator.core.processor.parameter.RawJsonRequestBodyProcessor
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
index 132bca899..046bd42fd 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiOperation.java
@@ -34,7 +34,6 @@ import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
 import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.PathItem;
@@ -57,8 +56,6 @@ public class TestApiOperation {
         tags = {"tag1", "tag2"},
         method = "GET",
         operationId = "test",
-        requestBody = @RequestBody(content = @Content(mediaType = MediaType.APPLICATION_JSON,
-            schema = @Schema(implementation = String.class))),
         responses = @ApiResponse(responseCode = "202",
             content = @Content(mediaType = MediaType.APPLICATION_JSON,
                 schema = @Schema(implementation = String.class)),
@@ -108,8 +105,6 @@ public class TestApiOperation {
     Assertions.assertEquals("summary", operation.getSummary());
     Assertions.assertEquals("notes", operation.getDescription());
     Assertions.assertEquals(Arrays.asList("tag1", "tag2"), operation.getTags());
-    Assertions.assertEquals("application/json",
-        operation.getRequestBody().getContent().keySet().iterator().next());
 
     ApiResponses responseMap = operation.getResponses();
     Assertions.assertEquals(1, responseMap.size());
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
index 9a4726cd8..70d2f344f 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/OperationMethodAnnotationProcessorTest.java
@@ -21,6 +21,7 @@ import static org.hamcrest.Matchers.containsInAnyOrder;
 
 import java.util.Map;
 
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperation;
 import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperations;
 import org.hamcrest.MatcherAssert;
@@ -59,9 +60,7 @@ public class OperationMethodAnnotationProcessorTest {
 
     @Operation(summary = "testSingleMediaType",
         responses = {@ApiResponse(responseCode = "200", content = @Content(
-            mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = String.class)))},
-        requestBody = @RequestBody(content = @Content(mediaType = MediaType.TEXT_PLAIN,
-            schema = @Schema(implementation = String.class))))
+            mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = String.class)))})
     public String testSingleMediaType(String input) {
       return input;
     }
@@ -71,13 +70,7 @@ public class OperationMethodAnnotationProcessorTest {
             @ApiResponse(responseCode = "200", content = {
                 @Content(mediaType = MediaType.APPLICATION_JSON),
                 @Content(mediaType = MediaType.TEXT_PLAIN)
-            })},
-        requestBody = @RequestBody(content = {
-            @Content(mediaType = MediaType.APPLICATION_JSON,
-                schema = @Schema(implementation = String.class)),
-            @Content(mediaType = MediaType.APPLICATION_XML,
-                schema = @Schema(implementation = String.class))
-        }))
+            })})
     public String testMultiMediaType(String input) {
       return input;
     }
@@ -151,7 +144,7 @@ public class OperationMethodAnnotationProcessorTest {
   public void testMultiMediaType() {
     SwaggerOperation swaggerOperation = swaggerOperations.findOperation("testMultiMediaType");
     MatcherAssert.assertThat(swaggerOperation.getOperation().getRequestBody().getContent().keySet(),
-        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE));
     MatcherAssert.assertThat(swaggerOperation.getOperation().getResponses().get("200").getContent().keySet(),
         Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
   }
@@ -160,7 +153,7 @@ public class OperationMethodAnnotationProcessorTest {
   public void testSingleMediaType() {
     SwaggerOperation swaggerOperation = swaggerOperations.findOperation("testSingleMediaType");
     MatcherAssert.assertThat(swaggerOperation.getOperation()
-            .getRequestBody().getContent().get(MediaType.TEXT_PLAIN).getSchema().get$ref(),
+            .getRequestBody().getContent().get(MediaType.APPLICATION_JSON).getSchema().get$ref(),
         Matchers.equalTo(Components.COMPONENTS_SCHEMAS_REF + "testSingleMediaTypeBody"));
     MatcherAssert.assertThat(swaggerOperation.getOperation()
             .getResponses().get("200").getContent().get(MediaType.APPLICATION_XML).getSchema().getType(),
@@ -171,7 +164,7 @@ public class OperationMethodAnnotationProcessorTest {
   public void testBlankMediaType() {
     SwaggerOperation swaggerOperation = swaggerOperations.findOperation("testBlankMediaType");
     MatcherAssert.assertThat(swaggerOperation.getOperation().getRequestBody().getContent().keySet(),
-        Matchers.contains(MediaType.APPLICATION_JSON));
+        Matchers.contains(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE));
     MatcherAssert.assertThat(swaggerOperation.getOperation().getResponses().getDefault().getContent().keySet(),
         Matchers.contains(MediaType.APPLICATION_JSON));
   }
@@ -185,11 +178,6 @@ public class OperationMethodAnnotationProcessorTest {
     Assertions.assertEquals(Components.COMPONENTS_SCHEMAS_REF + "TestBodyBean", schema.get$ref());
     schema = swaggerOperation.getSwagger().getComponents().getSchemas().get("TestBodyBean");
     Map<String, io.swagger.v3.oas.models.media.Schema> properties = schema.getProperties();
-
-//    swagger new version do not support primitive types(String, Integer, etc...) to use NotBlank, NotEmpty, ...)
-//    Assertions.assertTrue(properties.get("age").getNullable(), "Support NotBlank annotation");
-//    Assertions.assertTrue(properties.get("sexes").getNullable(), "Support NotEmpty annotation");
-//    Assertions.assertTrue(properties.get("name").getNullable(), "Original support NotNull annotation");
     Assertions.assertEquals(properties.get("age").getType(), "string");
     Assertions.assertEquals(properties.get("sexes").getType(), "string");
     Assertions.assertEquals(properties.get("name").getType(), "string");
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
index 701344d46..c370c3b1f 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/schema/Schema.java
@@ -25,9 +25,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.Part;
-
 import org.apache.servicecomb.foundation.test.scaffolding.model.Color;
 import org.apache.servicecomb.foundation.test.scaffolding.model.User;
 
@@ -35,8 +32,9 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import jakarta.servlet.http.HttpServletRequest;
 
-
+@SuppressWarnings("all")
 public class Schema {
   @Operation(method = "", hidden = true)
   public void hidden() {
@@ -211,18 +209,6 @@ public class Schema {
     return Collections.emptyList();
   }
 
-  public void part(Part part) {
-
-  }
-
-  public void partArray(Part[] part) {
-
-  }
-
-  public void partList(List<Part> part) {
-
-  }
-
   public void wrapToBodyWithDesc(@Parameter(name = "desc") int value) {
 
   }
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
index d56cebc2b..133803a55 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
@@ -31,6 +31,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/ignoreRequestBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/ignoreRequestBody'
         x-name: ignoreRequestBody
       responses:
         "200":
@@ -43,6 +46,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/nestedListStringBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/nestedListStringBody'
         x-name: nestedListStringBody
       responses:
         "200":
@@ -55,52 +61,6 @@ paths:
                   type: array
                   items:
                     type: string
-  /part:
-    post:
-      operationId: part
-      requestBody:
-        content:
-          multipart/form-data:
-            schema:
-              properties:
-                part:
-                  type: string
-                  format: binary
-      responses:
-        "200":
-          description: response of 200
-  /partArray:
-    post:
-      operationId: partArray
-      requestBody:
-        content:
-          multipart/form-data:
-            schema:
-              properties:
-                part:
-                  type: array
-                  items:
-                    type: string
-                    format: binary
-      responses:
-        "200":
-          description: response of 200
-  /partList:
-    post:
-      operationId: partList
-      requestBody:
-        content:
-          multipart/form-data:
-            schema:
-              properties:
-                part:
-                  type: array
-                  items:
-                    type: string
-                    format: binary
-      responses:
-        "200":
-          description: response of 200
   /testAllType:
     post:
       operationId: testAllType
@@ -109,6 +69,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/AllType'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/AllType'
         x-name: obj
       responses:
         "200":
@@ -153,6 +116,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testArrayBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testArrayBody'
         x-name: testArrayBody
       responses:
         "200":
@@ -165,6 +131,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testBooleanBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testBooleanBody'
         x-name: testBooleanBody
       responses:
         "200":
@@ -177,6 +146,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testByteBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testByteBody'
         x-name: testByteBody
       responses:
         "200":
@@ -189,6 +161,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testBytesBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testBytesBody'
         x-name: testBytesBody
       responses:
         "200":
@@ -201,6 +176,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testCharBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testCharBody'
         x-name: testCharBody
       responses:
         "200":
@@ -244,6 +222,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testDoubleBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testDoubleBody'
         x-name: testDoubleBody
       responses:
         "200":
@@ -256,6 +237,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testEnumBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testEnumBody'
         x-name: testEnumBody
       responses:
         "200":
@@ -268,6 +252,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testFloatBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testFloatBody'
         x-name: testFloatBody
       responses:
         "200":
@@ -280,6 +267,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testIntegerBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testIntegerBody'
         x-name: testIntegerBody
       responses:
         "200":
@@ -292,6 +282,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testListBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testListBody'
         x-name: testListBody
       responses:
         "200":
@@ -304,6 +297,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testLongBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testLongBody'
         x-name: testLongBody
       responses:
         "200":
@@ -316,6 +312,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testMapBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testMapBody'
         x-name: testMapBody
       responses:
         "200":
@@ -328,6 +327,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testMapListBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testMapListBody'
         x-name: testMapListBody
       responses:
         "200":
@@ -340,6 +342,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testMultiParamBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testMultiParamBody'
         x-name: testMultiParamBody
       responses:
         "200":
@@ -358,6 +363,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
         x-name: user
       responses:
         "200":
@@ -370,6 +378,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testOneEnumBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testOneEnumBody'
         x-name: testOneEnumBody
       responses:
         "200":
@@ -408,6 +419,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testSetBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testSetBody'
         x-name: testSetBody
       responses:
         "200":
@@ -420,6 +434,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testShortBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testShortBody'
         x-name: testShortBody
       responses:
         "200":
@@ -432,6 +449,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testStringBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testStringBody'
         x-name: testStringBody
       responses:
         "200":
@@ -444,6 +464,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testbooleanBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testbooleanBody'
         x-name: testbooleanBody
       responses:
         "200":
@@ -456,6 +479,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testbyteBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testbyteBody'
         x-name: testbyteBody
       responses:
         "200":
@@ -468,6 +494,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testbytesBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testbytesBody'
         x-name: testbytesBody
       responses:
         "200":
@@ -480,6 +509,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testcharBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testcharBody'
         x-name: testcharBody
       responses:
         "200":
@@ -492,6 +524,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testdoubleBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testdoubleBody'
         x-name: testdoubleBody
       responses:
         "200":
@@ -504,6 +539,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testfloatBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testfloatBody'
         x-name: testfloatBody
       responses:
         "200":
@@ -516,6 +554,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testintBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testintBody'
         x-name: testintBody
       responses:
         "200":
@@ -528,6 +569,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testlongBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testlongBody'
         x-name: testlongBody
       responses:
         "200":
@@ -540,6 +584,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testshortBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testshortBody'
         x-name: testshortBody
       responses:
         "200":
@@ -552,6 +599,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/wrapToBodyWithDescBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/wrapToBodyWithDescBody'
         x-name: wrapToBodyWithDescBody
       responses:
         "200":
@@ -820,6 +870,6 @@ components:
     wrapToBodyWithDescBody:
       type: object
       properties:
-        desc:
+        value:
           type: integer
-          format: int32
+          format: int32
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
index 93d653922..096e157a2 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
@@ -31,6 +31,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/testMultiParameterBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/testMultiParameterBody'
         x-name: testMultiParameterBody
       responses:
         "200":
@@ -47,6 +50,9 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/XXX'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/XXX'
         x-name: testType1
       responses:
         "200":
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/JaxrsOperationGenerator.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/JaxrsOperationGenerator.java
index 152af72fb..829b64a44 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/JaxrsOperationGenerator.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/JaxrsOperationGenerator.java
@@ -27,9 +27,6 @@ import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.rest.RestOperationGenerator;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
 import jakarta.ws.rs.BeanParam;
 
 public class JaxrsOperationGenerator extends RestOperationGenerator {
@@ -50,11 +47,4 @@ public class JaxrsOperationGenerator extends RestOperationGenerator {
   protected boolean isAggregatedParameter(ParameterGenerator parameterGenerator, Parameter methodParameter) {
     return methodParameter.getAnnotation(BeanParam.class) != null;
   }
-
-  @Override
-  protected void fillParameter(OpenAPI swagger, io.swagger.v3.oas.models.parameters.Parameter parameter,
-      String parameterName,
-      JavaType type, List<Annotation> annotations) {
-    super.fillParameter(swagger, parameter, parameterName, type, annotations);
-  }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesClassAnnotationProcessor.java
similarity index 70%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
copy to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesClassAnnotationProcessor.java
index 15283a8e1..72ae4d20f 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesClassAnnotationProcessor.java
@@ -14,24 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.Arrays;
 
-import jakarta.ws.rs.Path;
-
-import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path> {
+import jakarta.ws.rs.Consumes;
+
+public class ConsumesClassAnnotationProcessor extends JaxrsClassAnnotationProcessor<Consumes> {
   @Override
   public Type getProcessType() {
-    return Path.class;
+    return Consumes.class;
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, Path path) {
-    swaggerGenerator.setBasePath(path.value());
+  public void process(SwaggerGenerator swaggerGenerator, Consumes consumes) {
+    if (consumes.value() != null && consumes.value().length > 0) {
+      swaggerGenerator.getSwaggerGeneratorContext().updateConsumes(Arrays.asList(consumes.value()));
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesMethodAnnotationProcessor.java
similarity index 78%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesMethodAnnotationProcessor.java
index dd96bfeb4..2cfdb26dc 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesMethodAnnotationProcessor.java
@@ -18,14 +18,14 @@
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.Arrays;
 
-import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
 import jakarta.ws.rs.Consumes;
 
-public class ConsumesAnnotationProcessor implements MethodAnnotationProcessor<Consumes> {
+public class ConsumesMethodAnnotationProcessor extends JaxrsMethodAnnotationProcessor<Consumes> {
   @Override
   public Type getProcessType() {
     return Consumes.class;
@@ -33,8 +33,8 @@ public class ConsumesAnnotationProcessor implements MethodAnnotationProcessor<Co
 
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator, Consumes consumes) {
-    // TODO: actually is no use to update consumes and produces
-    // Because they are system capabilities.
-//    SwaggerUtils.updateConsumes(operationGenerator.getOperation(), consumes.value());
+    if (consumes.value() != null && consumes.value().length > 0) {
+      operationGenerator.getOperationGeneratorContext().updateConsumes(Arrays.asList(consumes.value()));
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
index 8ca44d895..1afa3efee 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
@@ -32,7 +32,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.CookieParam;
 
 public class CookieParamAnnotationProcessor extends
-    AbstractJaxrsParameterProcessor<CookieParam> {
+    JaxrsParameterProcessor<CookieParam> {
   @Override
   public Type getProcessType() {
     return CookieParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteMethodAnnotationProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteMethodAnnotationProcessor.java
index e5cc735b1..41df10015 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/DeleteMethodAnnotationProcessor.java
@@ -20,7 +20,7 @@ import java.lang.reflect.Type;
 
 import jakarta.ws.rs.DELETE;
 
-public class DeleteAnnotationProcessor extends GetAnnotationProcessor {
+public class DeleteMethodAnnotationProcessor extends GetMethodAnnotationProcessor {
   @Override
   public Type getProcessType() {
     return DELETE.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
index 101b5af8f..1edd9c215 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
@@ -37,7 +37,7 @@ import jakarta.servlet.http.Part;
 import jakarta.ws.rs.FormParam;
 
 @SuppressWarnings({"rawtypes", "unchecked"})
-public class FormParamAnnotationProcessor extends AbstractJaxrsParameterProcessor<FormParam> {
+public class FormParamAnnotationProcessor extends JaxrsParameterProcessor<FormParam> {
   @Override
   public Type getProcessType() {
     return FormParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetMethodAnnotationProcessor.java
similarity index 90%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetMethodAnnotationProcessor.java
index 05885cddb..e8051063a 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/GetMethodAnnotationProcessor.java
@@ -20,14 +20,13 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HttpMethod;
-
-import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
-public class GetAnnotationProcessor implements MethodAnnotationProcessor<Annotation> {
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.HttpMethod;
+
+public class GetMethodAnnotationProcessor extends JaxrsMethodAnnotationProcessor<Annotation> {
   @Override
   public Type getProcessType() {
     return GET.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
index 8a07083d1..2d917317e 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
@@ -33,7 +33,7 @@ import jakarta.ws.rs.HeaderParam;
 
 @SuppressWarnings("rawtypes")
 public class HeaderParamAnnotationProcessor extends
-    AbstractJaxrsParameterProcessor<HeaderParam> {
+    JaxrsParameterProcessor<HeaderParam> {
   @Override
   public Type getProcessType() {
     return HeaderParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/AbstractJaxrsParameterProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsClassAnnotationProcessor.java
similarity index 77%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/AbstractJaxrsParameterProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsClassAnnotationProcessor.java
index cdfe7d889..f1f1eb48b 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/AbstractJaxrsParameterProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsClassAnnotationProcessor.java
@@ -14,10 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
-import org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
+import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
 
-public abstract class AbstractJaxrsParameterProcessor<ANNOTATION> extends AbstractParameterProcessor<ANNOTATION> {
+/**
+ * A generic class to help classify implementations.
+ */
+public abstract class JaxrsClassAnnotationProcessor<ANNOTATION>
+    implements ClassAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsMethodAnnotationProcessor.java
similarity index 77%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java
copy to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsMethodAnnotationProcessor.java
index da7fd0dc3..cb8bd64e1 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsMethodAnnotationProcessor.java
@@ -16,13 +16,11 @@
  */
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
-import java.lang.reflect.Type;
+import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 
-import jakarta.ws.rs.POST;
-
-public class PostAnnotationProcessor extends GetAnnotationProcessor {
-  @Override
-  public Type getProcessType() {
-    return POST.class;
-  }
+/**
+ * A generic class to help classify implementations.
+ */
+public abstract class JaxrsMethodAnnotationProcessor<ANNOTATION>
+    implements MethodAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
similarity index 81%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
copy to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
index 3b0f5ecf4..db5f22ade 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
@@ -14,15 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
-import java.lang.reflect.Type;
+package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
-import jakarta.ws.rs.PUT;
+import org.apache.servicecomb.swagger.generator.ParameterProcessor;
 
-public class PutAnnotationProcessor extends GetAnnotationProcessor {
-  @Override
-  public Type getProcessType() {
-    return PUT.class;
-  }
+public abstract class JaxrsParameterProcessor<ANNOTATION> implements
+    ParameterProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchMethodAnnotationProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchMethodAnnotationProcessor.java
index e2648cd02..807abd657 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PatchMethodAnnotationProcessor.java
@@ -20,7 +20,7 @@ import java.lang.reflect.Type;
 
 import jakarta.ws.rs.PATCH;
 
-public class PatchAnnotationProcessor extends GetAnnotationProcessor {
+public class PatchMethodAnnotationProcessor extends GetMethodAnnotationProcessor {
   @Override
   public Type getProcessType() {
     return PATCH.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
index 15283a8e1..6a1d4f47d 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
@@ -24,7 +24,7 @@ import jakarta.ws.rs.Path;
 import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path> {
+public class PathClassAnnotationProcessor extends JaxrsClassAnnotationProcessor<Path> {
   @Override
   public Type getProcessType() {
     return Path.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
index 80931c209..0520f0121 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
@@ -25,7 +25,7 @@ import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
-public class PathMethodAnnotationProcessor implements MethodAnnotationProcessor<Path> {
+public class PathMethodAnnotationProcessor extends JaxrsMethodAnnotationProcessor<Path> {
   @Override
   public Type getProcessType() {
     return Path.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
index 502e8c7aa..b856a1bfd 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
@@ -32,7 +32,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.PathParam;
 
 @SuppressWarnings("rawtypes")
-public class PathParamAnnotationProcessor extends AbstractJaxrsParameterProcessor<PathParam> {
+public class PathParamAnnotationProcessor extends JaxrsParameterProcessor<PathParam> {
   @Override
   public Type getProcessType() {
     return PathParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostMethodAnnotationProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostMethodAnnotationProcessor.java
index da7fd0dc3..e70d27275 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PostMethodAnnotationProcessor.java
@@ -20,7 +20,7 @@ import java.lang.reflect.Type;
 
 import jakarta.ws.rs.POST;
 
-public class PostAnnotationProcessor extends GetAnnotationProcessor {
+public class PostMethodAnnotationProcessor extends GetMethodAnnotationProcessor {
   @Override
   public Type getProcessType() {
     return POST.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesClassAnnotationProcessor.java
similarity index 70%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
copy to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesClassAnnotationProcessor.java
index 15283a8e1..9450504ce 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesClassAnnotationProcessor.java
@@ -14,24 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.Arrays;
 
-import jakarta.ws.rs.Path;
-
-import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path> {
+import jakarta.ws.rs.Produces;
+
+public class ProducesClassAnnotationProcessor extends JaxrsClassAnnotationProcessor<Produces> {
   @Override
   public Type getProcessType() {
-    return Path.class;
+    return Produces.class;
   }
 
   @Override
-  public void process(SwaggerGenerator swaggerGenerator, Path path) {
-    swaggerGenerator.setBasePath(path.value());
+  public void process(SwaggerGenerator swaggerGenerator, Produces produces) {
+    if (produces.value() != null && produces.value().length > 0) {
+      swaggerGenerator.getSwaggerGeneratorContext().updateProduces(Arrays.asList(produces.value()));
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesMethodAnnotationProcessor.java
similarity index 78%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesMethodAnnotationProcessor.java
index d729dd442..a148413ef 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesMethodAnnotationProcessor.java
@@ -18,14 +18,14 @@
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
+import java.util.Arrays;
 
-import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
 import jakarta.ws.rs.Produces;
 
-public class ProducesAnnotationProcessor implements MethodAnnotationProcessor<Produces> {
+public class ProducesMethodAnnotationProcessor extends JaxrsMethodAnnotationProcessor<Produces> {
   @Override
   public Type getProcessType() {
     return Produces.class;
@@ -33,8 +33,8 @@ public class ProducesAnnotationProcessor implements MethodAnnotationProcessor<Pr
 
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator, Produces produces) {
-    // TODO: actually is no use to update consumes and produces
-    // Because they are system capabilities.
-//    SwaggerUtils.updateProduces(operationGenerator.getOperation(), produces.value());
+    if (produces.value() != null && produces.value().length > 0) {
+      operationGenerator.getOperationGeneratorContext().updateProduces(Arrays.asList(produces.value()));
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutMethodAnnotationProcessor.java
similarity index 92%
rename from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
rename to swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutMethodAnnotationProcessor.java
index 3b0f5ecf4..9756b05fe 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PutMethodAnnotationProcessor.java
@@ -20,7 +20,7 @@ import java.lang.reflect.Type;
 
 import jakarta.ws.rs.PUT;
 
-public class PutAnnotationProcessor extends GetAnnotationProcessor {
+public class PutMethodAnnotationProcessor extends GetMethodAnnotationProcessor {
   @Override
   public Type getProcessType() {
     return PUT.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
index d245065ac..23cd33ffc 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
@@ -32,7 +32,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.QueryParam;
 
 @SuppressWarnings("rawtypes")
-public class QueryParamAnnotationProcessor extends AbstractJaxrsParameterProcessor<QueryParam> {
+public class QueryParamAnnotationProcessor extends JaxrsParameterProcessor<QueryParam> {
   @Override
   public Type getProcessType() {
     return QueryParam.class;
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
index 793163da1..bb469664e 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor
@@ -15,4 +15,6 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathClassAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathClassAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ConsumesClassAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ProducesClassAnnotationProcessor
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor
index d9fb2e2b4..d65e2e628 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor
@@ -15,11 +15,11 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ConsumesAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ProducesAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ConsumesMethodAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ProducesMethodAnnotationProcessor
 org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PathMethodAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.GetAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PostAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PutAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.DeleteAnnotationProcessor
-org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PatchAnnotationProcessor
\ No newline at end of file
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.GetMethodAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PostMethodAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PutMethodAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.DeleteMethodAnnotationProcessor
+org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.PatchMethodAnnotationProcessor
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/ClassAnnotation.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/ClassAnnotation.java
new file mode 100644
index 000000000..60e1db688
--- /dev/null
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/ClassAnnotation.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.swagger.generator.jaxrs;
+
+import org.apache.servicecomb.foundation.test.scaffolding.model.User;
+
+import jakarta.servlet.http.Part;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.FormParam;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+
+@Path("/class")
+@Consumes(value = {MediaType.APPLICATION_JSON})
+@Produces(value = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
+@SuppressWarnings("unused")
+public class ClassAnnotation {
+  @Path(value = "testBean")
+  @POST
+  public User testBean(User user) {
+    return null;
+  }
+
+  @Path(value = "testString")
+  @POST
+  public String testString(String user) {
+    return null;
+  }
+
+  // This case should cause error. Must implicitly specify consumes.
+  // For JAX RS, @FormParam can be url-encoded-form or multipart.
+  @Path(value = "testFormWrong")
+  @POST
+  public String testFormWrong(@FormParam("param") int param) {
+    return null;
+  }
+
+  // This case should cause error. Must implicitly specify consumes
+  // For JAX RS, @FormParam can be url-encoded-form or multipart.
+  @Path(value = "testUploadWrong")
+  @POST
+  public String testUploadWrong(@FormParam("part") Part part) {
+    return null;
+  }
+
+  @Path(value = "testForm")
+  @POST
+  @Consumes(value = MediaType.APPLICATION_FORM_URLENCODED)
+  public String testForm(@FormParam("param") int param) {
+    return null;
+  }
+
+  @Path(value = "testUpload")
+  @POST
+  @Consumes(value = MediaType.MULTIPART_FORM_DATA)
+  public String testUpload(@FormParam("part") Part part) {
+    return null;
+  }
+}
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
similarity index 53%
copy from swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
copy to swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
index 15283a8e1..f910cc241 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
@@ -14,24 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.servicecomb.swagger.generator.jaxrs;
 
-package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
+import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
+import org.junit.jupiter.api.Test;
 
-import java.lang.reflect.Type;
-
-import jakarta.ws.rs.Path;
-
-import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
-import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+public class TestClassAnnotation {
+  @Test
+  public void test_generate_swagger_correct() {
+    UnitTestSwaggerUtils.testSwagger("schemas/ClassAnnotation.yaml", ClassAnnotation.class,
+        "testBean", "testString", "testForm", "testUpload");
+  }
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path> {
-  @Override
-  public Type getProcessType() {
-    return Path.class;
+  @Test
+  public void test_form_wrong() {
+    UnitTestSwaggerUtils.testException("wrong", ClassAnnotation.class,
+        "testFormWrong");
   }
 
-  @Override
-  public void process(SwaggerGenerator swaggerGenerator, Path path) {
-    swaggerGenerator.setBasePath(path.value());
+  @Test
+  public void test_upload_wrong() {
+    UnitTestSwaggerUtils.testException("wrong", ClassAnnotation.class,
+        "testUploadWrong");
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
similarity index 57%
copy from swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
copy to swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
index 93d653922..35b60c51b 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/pojoExample1.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
@@ -15,59 +15,38 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
----
 openapi: 3.0.1
 info:
-  title: swagger definition for org.apache.servicecomb.swagger.generator.core.pojo.PojoExample1
+  title: swagger definition for org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation
   version: 1.0.0
 servers:
-- url: /PojoExample1
+  - url: /class
 paths:
-  /testMultiParameter:
+  /cookie:
     post:
-      operationId: testMultiParameter
+      operationId: cookie
       requestBody:
         content:
           application/json:
             schema:
-              $ref: '#/components/schemas/testMultiParameterBody'
-        x-name: testMultiParameterBody
+              $ref: '#/components/schemas/User'
+        x-name: user
       responses:
         "200":
           description: response of 200
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/XXX'
-  /testOneParameter:
-    post:
-      operationId: testOneParameter
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: '#/components/schemas/XXX'
-        x-name: testType1
-      responses:
-        "200":
-          description: response of 200
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/XXX'
+                type: string
 components:
   schemas:
-    XXX:
-      type: object
-      properties:
-        val1:
-          type: integer
-          format: int32
-      x-java-class: org.apache.servicecomb.swagger.generator.core.pojo.TestType1
-    testMultiParameterBody:
+    User:
       type: object
       properties:
-        testType1:
-          $ref: '#/components/schemas/XXX'
-        testString:
-          type: string
\ No newline at end of file
+        name:
+          type: string
+        friends:
+          type: array
+          items:
+            $ref: '#/components/schemas/User'
+      x-java-class: org.apache.servicecomb.foundation.test.scaffolding.model.User
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
index 5041e3462..d47447340 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
@@ -39,10 +39,7 @@ public class SpringmvcOperationGenerator extends RestOperationGenerator {
 
     parameterGenerators.stream()
         .filter(pg -> pg.getHttpParameterType() == null)
-        .forEach(pg -> {
-          pg.setHttpParameterType(HttpParameterType.QUERY);
-          pg.setGeneratedParameter(createParameter(HttpParameterType.QUERY));
-        });
+        .forEach(pg -> pg.setHttpParameterType(HttpParameterType.QUERY));
   }
 
   @Override
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
index de38867e7..2849c1cf2 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
@@ -19,10 +19,10 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayProcessor;
+import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
-public class MultipartFileArrayProcessor extends PartArrayProcessor {
+public class MultipartFileArrayProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
     return MultipartFile[].class;
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
index 0611209ee..41be450a7 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
@@ -20,12 +20,12 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 import java.lang.reflect.Type;
 import java.util.List;
 
-import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayProcessor;
+import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.google.inject.util.Types;
 
-public class MultipartFileListProcessor extends PartArrayProcessor {
+public class MultipartFileListProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
     return Types.newParameterizedType(List.class, MultipartFile.class);
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
index 8daf22035..c2c9c3475 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileTypeProcessor.java
@@ -19,10 +19,10 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.parameter;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartProcessor;
+import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
-public class MultipartFileTypeProcessor extends PartProcessor {
+public class MultipartFileTypeProcessor extends PartParameterTypeProcessor {
   @Override
   public Type getProcessType() {
     return MultipartFile.class;


[servicecomb-java-chassis] 12/12: [SCB-2803]fix checkstyle

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit c30191c05139323f21e267e74ed941a480048f14
Author: liubao <bi...@qq.com>
AuthorDate: Wed Aug 16 08:51:55 2023 +0800

    [SCB-2803]fix checkstyle
---
 .../jaxrs/processor/annotation/PathClassAnnotationProcessor.java     | 5 ++---
 .../jaxrs/processor/annotation/PathMethodAnnotationProcessor.java    | 5 ++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
index 6a1d4f47d..376ef7128 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathClassAnnotationProcessor.java
@@ -19,11 +19,10 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import jakarta.ws.rs.Path;
-
-import org.apache.servicecomb.swagger.generator.ClassAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
+import jakarta.ws.rs.Path;
+
 public class PathClassAnnotationProcessor extends JaxrsClassAnnotationProcessor<Path> {
   @Override
   public Type getProcessType() {
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
index 0520f0121..2eb1fd39e 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java
@@ -19,12 +19,11 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import jakarta.ws.rs.Path;
-
-import org.apache.servicecomb.swagger.generator.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 
+import jakarta.ws.rs.Path;
+
 public class PathMethodAnnotationProcessor extends JaxrsMethodAnnotationProcessor<Path> {
   @Override
   public Type getProcessType() {


[servicecomb-java-chassis] 08/12: [SCB-2803]fix problems in spring mvc test case

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 59b9d4a4f10997b3934f8a147c1fc7f3a844a494
Author: liubao <bi...@qq.com>
AuthorDate: Mon Aug 14 11:41:11 2023 +0800

    [SCB-2803]fix problems in spring mvc test case
---
 .../apache/servicecomb/swagger/SwaggerUtils.java   |  3 +-
 .../swagger/generator/ParameterGenerator.java      |  4 ++
 .../generator/jaxrs/TestClassAnnotation.java       | 10 ++--
 .../swagger/generator/jaxrs/TestJaxrs.java         | 18 ++++----
 .../test/resources/schemas/FullSwaggerService.yaml |  3 +-
 .../src/test/resources/schemas/echo.yaml           |  1 +
 .../springmvc/SpringmvcOperationGenerator.java     | 12 ++++-
 .../RequestHeaderAnnotationProcessor.java          |  2 +-
 .../annotation/RequestParamParameterProcessor.java |  2 +-
 .../src/test/resources/schemas/DemoRest.yaml       |  3 +-
 .../test/resources/schemas/defaultParameter.yaml   |  3 +-
 .../src/test/resources/schemas/echo.yaml           |  3 +-
 .../test/resources/schemas/mixupAnnotations.yaml   | 54 +++++++++++++++++++++-
 13 files changed, 93 insertions(+), 25 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
index 5124809f4..6522335f8 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
@@ -37,6 +37,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.base.DynamicEnum;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.swagger.generator.SwaggerConst;
+import org.springframework.util.CollectionUtils;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -228,7 +229,7 @@ public final class SwaggerUtils {
     }
 
     Map<String, Schema> schemaMap = resolvedSchema.referencedSchemas;
-    if (schemaMap != null) {
+    if (!CollectionUtils.isEmpty(schemaMap)) {
       Map<String, Schema> componentSchemas = swagger.getComponents().getSchemas();
       if (componentSchemas == null) {
         componentSchemas = new LinkedHashMap<>(schemaMap);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index 326bec32d..9b2be38d5 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -195,5 +195,9 @@ public class ParameterGenerator {
           annotations, operationGenerator.getSwagger().getComponents(),
           null, null, null);
     }
+    // spring mvc DefaultValue annotation not processed by swagger api.
+    if (parameterGeneratorContext.getDefaultValue() != null) {
+      parameter.getSchema().setDefault(parameterGeneratorContext.getDefaultValue());
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
index 7dfb379f2..b17d04f70 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
@@ -28,16 +28,18 @@ public class TestClassAnnotation {
 
   @Test
   public void test_form_wrong() {
-    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
-            + "method=org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation:testFormWrong.",
+    UnitTestSwaggerUtils.testException("Generate swagger operation failed, "
+            + "method=ClassAnnotation:testFormWrong, cause=Consumes not provided for FORM parameter, "
+            + "or is empty by annotations rule.",
         ClassAnnotation.class,
         "testFormWrong");
   }
 
   @Test
   public void test_upload_wrong() {
-    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
-            + "method=org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation:testUploadWrong.",
+    UnitTestSwaggerUtils.testException("Generate swagger operation failed, "
+            + "method=ClassAnnotation:testUploadWrong, "
+            + "cause=Part type must declare consumes multipart/form-data",
         ClassAnnotation.class,
         "testUploadWrong");
   }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
index 0888b3389..0b31ba695 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
@@ -38,8 +38,8 @@ public class TestJaxrs {
   @Test
   public void testClassMethodNoPath() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.jaxrs.ClassMethodNoPath:p1.",
-        "Path must not both be empty in class and method",
+        "Generate swagger operation failed, "
+            + "method=ClassMethodNoPath:p1, cause=Path must not both be empty in class and method",
         ClassMethodNoPath.class);
   }
 
@@ -50,22 +50,24 @@ public class TestJaxrs {
 
   @Test
   public void consumesAndProduces_exception_testSingleMediaType() {
-    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
-            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testSingleMediaType.",
+    UnitTestSwaggerUtils.testException("Generate swagger operation failed, "
+            + "method=ConsumesAndProduces:testSingleMediaType, "
+            + "cause=Not support media type application/xml",
         ConsumesAndProduces.class, "testSingleMediaType");
   }
 
   @Test
   public void consumesAndProduces_exception_testMultipleMediaType() {
-    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
-            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testMultipleMediaType.",
+    UnitTestSwaggerUtils.testException("Generate swagger operation failed, "
+            + "method=ConsumesAndProduces:testMultipleMediaType, "
+            + "cause=Not support media type application/xml",
         ConsumesAndProduces.class, "testMultipleMediaType");
   }
 
   @Test
   public void consumesAndProduces_exception_testBlankMediaType() {
-    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
-            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testBlankMediaType.",
+    UnitTestSwaggerUtils.testException("Generate swagger operation failed, "
+            + "method=ConsumesAndProduces:testBlankMediaType, cause=Not support media type ",
         ConsumesAndProduces.class, "testBlankMediaType");
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
index e0e403c79..2fb53e131 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/FullSwaggerService.yaml
@@ -105,5 +105,4 @@ paths:
             application/json:
               schema:
                 type: string
-components:
-  schemas: {}
\ No newline at end of file
+components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
index a87b307ae..3776926a6 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
@@ -422,6 +422,7 @@ paths:
           text/plain:
             schema:
               type: string
+        required: true
         x-raw-json: true
         x-name: jsonInput
       responses:
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
index d47447340..f9112f366 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/SpringmvcOperationGenerator.java
@@ -27,6 +27,7 @@ import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.rest.RestOperationGenerator;
+import org.springframework.web.bind.annotation.RequestBody;
 
 public class SpringmvcOperationGenerator extends RestOperationGenerator {
   public SpringmvcOperationGenerator(AbstractSwaggerGenerator swaggerGenerator, Method method) {
@@ -44,7 +45,16 @@ public class SpringmvcOperationGenerator extends RestOperationGenerator {
 
   @Override
   protected boolean isAggregatedParameter(ParameterGenerator parameterGenerator, Parameter methodParameter) {
-    return parameterGenerator.getHttpParameterType() == null
+    return !isRequestBody(parameterGenerator)
         && SwaggerUtils.isBean(methodParameter.getParameterizedType());
   }
+
+  private boolean isRequestBody(ParameterGenerator parameterGenerator) {
+    for (Annotation annotation : parameterGenerator.getAnnotations()) {
+      if (annotation.annotationType() == RequestBody.class) {
+        return true;
+      }
+    }
+    return false;
+  }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
index 5d7b14841..dac8e2e05 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
@@ -49,7 +49,7 @@ public class RequestHeaderAnnotationProcessor extends
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, RequestHeader annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    parameterGenerator.setHttpParameterType(HttpParameterType.HEADER);
     if (StringUtils.isNotEmpty(getParameterName(annotation))) {
       parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
index daeb63efd..66785a337 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
@@ -56,7 +56,7 @@ public class RequestParamParameterProcessor extends
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, RequestParam annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    parameterGenerator.setHttpParameterType(HttpParameterType.QUERY);
     if (StringUtils.isNotEmpty(getParameterName(annotation))) {
       parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
index c7a325a94..086a96cf7 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
@@ -61,5 +61,4 @@ paths:
       responses:
         "200":
           description: response of 200
-components:
-  schemas: {}
\ No newline at end of file
+components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
index ba3af4ca1..9ebc918de 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
@@ -95,5 +95,4 @@ paths:
       responses:
         "200":
           description: response of 200
-components:
-  schemas: {}
\ No newline at end of file
+components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
index c82aa04f9..97837adfb 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
@@ -274,5 +274,4 @@ paths:
             application/json:
               schema:
                 type: string
-components:
-  schemas: {}
\ No newline at end of file
+components: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
index a9334123c..7c04f5016 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
@@ -32,6 +32,14 @@ paths:
             schema:
               type: string
               format: byte
+          application/protobuf:
+            schema:
+              type: string
+              format: byte
+          text/plain:
+            schema:
+              type: string
+              format: byte
         required: true
         x-name: value
       responses:
@@ -55,6 +63,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: user
       responses:
@@ -96,6 +110,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 file1:
                   type: string
@@ -123,7 +138,6 @@ paths:
       - name: a
         in: query
         required: false
-        explode: false
         schema:
           type: string
       responses:
@@ -211,6 +225,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 file:
                   type: string
@@ -231,6 +246,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 files:
                   type: array
@@ -270,6 +286,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:
@@ -303,6 +325,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:
@@ -336,6 +364,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:
@@ -369,6 +403,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:
@@ -402,6 +442,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:
@@ -435,6 +481,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         required: true
         x-name: srcUser
       responses:


[servicecomb-java-chassis] 03/12: [SCB-2803]fix swagger generator jaxrs to support many codec implementations

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 32e6157c38d2301dedfff33c46cd1d0a32e0afb9
Author: liubao <bi...@qq.com>
AuthorDate: Fri Aug 11 10:17:36 2023 +0800

    [SCB-2803]fix swagger generator jaxrs to support many codec implementations
---
 .../swagger/generator/OperationGenerator.java      | 10 +++
 .../swagger/generator/OperationPostProcessor.java  | 28 -------
 .../swagger/generator/ParameterGenerator.java      | 14 +++-
 .../swagger/generator/SwaggerGeneratorUtils.java   | 14 ----
 .../generator/core/AbstractOperationGenerator.java | 34 +++++++--
 .../generator/core/ParameterGeneratorContext.java  | 34 ++++++++-
 .../processor/parameter/EnumPostProcessor.java     | 78 -------------------
 ...cecomb.swagger.generator.OperationPostProcessor | 18 -----
 .../annotation/PathParamAnnotationProcessor.java   |  1 +
 .../src/test/resources/schemas/echo.yaml           | 89 +++++++++++++++-------
 10 files changed, 144 insertions(+), 176 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
index 229039190..1d5bec48c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
@@ -38,4 +38,14 @@ public interface OperationGenerator {
   void generateResponse();
 
   OperationGeneratorContext getOperationGeneratorContext();
+
+  /**
+   * Used to check if one of operation has form parameter
+   */
+  boolean isForm();
+
+  /**
+   * Used to check if one of operation form parameter is binary
+   */
+  boolean isBinary();
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationPostProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationPostProcessor.java
deleted file mode 100644
index 0509de3cf..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationPostProcessor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator;
-
-import org.apache.servicecomb.swagger.generator.core.AbstractOperationGenerator;
-import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
-
-public interface OperationPostProcessor {
-  boolean shouldProcess(AbstractSwaggerGenerator swaggerGenerator,
-      AbstractOperationGenerator operationGenerator);
-
-  void process(AbstractSwaggerGenerator swaggerGenerator,
-      AbstractOperationGenerator operationGenerator);
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index c030e067c..c085b8751 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -114,8 +114,17 @@ public class ParameterGenerator {
     this.parameterGeneratorContext.setHttpParameterType(httpParameterType);
   }
 
+  public boolean isForm() {
+    return parameterGeneratorContext.isForm();
+  }
+
+  public boolean isBinary() {
+    return parameterGeneratorContext.isBinary();
+  }
+
   public void generate() {
-    this.parameterGeneratorContext.updateConsumes();
+    this.parameterGeneratorContext.updateConsumes(
+        this.operationGenerator.isForm(), this.operationGenerator.isBinary());
 
     if (this.parameterGeneratorContext.getHttpParameterType() == HttpParameterType.BODY) {
       if (parameterGeneratorContext.getSupportedConsumes().size() == 0) {
@@ -125,6 +134,9 @@ public class ParameterGenerator {
       RequestBody requestBody = new RequestBody();
       Map<String, Object> extensions = new HashMap<>();
       extensions.put(SwaggerConst.EXT_BODY_NAME, parameterGeneratorContext.getParameterName());
+      if (parameterGeneratorContext.getRawJson() != null) {
+        extensions.put(SwaggerConst.EXT_RAW_JSON_TYPE, parameterGeneratorContext.getRawJson());
+      }
       requestBody.setExtensions(extensions);
       requestBody.setContent(new Content());
       for (String media : parameterGeneratorContext.getSupportedConsumes()) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
index 196b3b4e4..1b71d9dcc 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/SwaggerGeneratorUtils.java
@@ -31,8 +31,6 @@ import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.swagger.generator.core.AbstractOperationGenerator;
-import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.apache.servicecomb.swagger.generator.core.processor.response.DefaultResponseTypeProcessor;
 import org.slf4j.Logger;
@@ -65,9 +63,6 @@ public final class SwaggerGeneratorUtils {
 
   private static final DefaultResponseTypeProcessor defaultResponseTypeProcessor = new DefaultResponseTypeProcessor();
 
-  private static final List<OperationPostProcessor> operationPostProcessors = SPIServiceUtils
-      .getOrLoadSortedService(OperationPostProcessor.class);
-
   private static final List<ParameterAnnotationProcessor> parameterAnnotationProcessors = SPIServiceUtils
       .getOrLoadSortedService(ParameterAnnotationProcessor.class);
 
@@ -114,15 +109,6 @@ public final class SwaggerGeneratorUtils {
   private SwaggerGeneratorUtils() {
   }
 
-  public static void postProcessOperation(AbstractSwaggerGenerator swaggerGenerator,
-      AbstractOperationGenerator operationGenerator) {
-    for (OperationPostProcessor processor : operationPostProcessors) {
-      if (processor.shouldProcess(swaggerGenerator, operationGenerator)) {
-        processor.process(swaggerGenerator, operationGenerator);
-      }
-    }
-  }
-
   @SuppressWarnings("unchecked")
   public static <ANNOTATION> ClassAnnotationProcessor<ANNOTATION> findClassAnnotationProcessor(Type type) {
     return (ClassAnnotationProcessor<ANNOTATION>) classAnnotationProcessors.get(type);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index 97c09936e..f78812f6d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -20,7 +20,6 @@ import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.col
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findMethodAnnotationProcessor;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.findResponseTypeProcessor;
 import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.isContextParameter;
-import static org.apache.servicecomb.swagger.generator.SwaggerGeneratorUtils.postProcessOperation;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
@@ -157,8 +156,6 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     scanMethodParameters();
     scanResponse();
     correctOperation();
-
-    postProcessOperation(swaggerGenerator, this);
   }
 
   protected void scanMethodAnnotation() {
@@ -178,8 +175,10 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
   }
 
   protected void scanMethodParameters() {
+    // init generators
     initParameterGenerators();
 
+    // scan annotations and types
     Set<String> names = new HashSet<>();
     int bodyCount = 0;
     for (ParameterGenerator parameterGenerator : parameterGenerators) {
@@ -196,6 +195,10 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
         }
         bodyCount++;
       }
+    }
+
+    // generate
+    for (ParameterGenerator parameterGenerator : parameterGenerators) {
       parameterGenerator.generate();
     }
   }
@@ -317,10 +320,7 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
 
     Schema<?> schema = parameterGenerator.getParameterGeneratorContext().getSchema();
     if (schema == null) {
-      JavaType parameterType = parameterGenerator.getParameterGeneratorContext().getParameterType();
-      if (parameterType == null) {
-        parameterType = parameterGenerator.getGenericType();
-      }
+      JavaType parameterType = parameterGenerator.getGenericType();
       ParameterTypeProcessor processor = SwaggerGeneratorUtils.findParameterTypeProcessor(parameterType);
       if (processor != null) {
         processor.process(this.swaggerGenerator, this, parameterGenerator);
@@ -331,6 +331,26 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     }
   }
 
+  @Override
+  public boolean isForm() {
+    for (ParameterGenerator parameterGenerator : parameterGenerators) {
+      if (parameterGenerator.isForm()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public boolean isBinary() {
+    for (ParameterGenerator parameterGenerator : parameterGenerators) {
+      if (parameterGenerator.isBinary()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   @Override
   public void addOperationToSwagger() {
     if (StringUtils.isEmpty(httpMethod)) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
index adf9f849b..fc8e09481 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
@@ -24,6 +24,7 @@ import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import com.fasterxml.jackson.databind.JavaType;
 
 import io.swagger.v3.oas.models.media.Schema;
+import jakarta.ws.rs.core.MediaType;
 
 public class ParameterGeneratorContext extends OperationGeneratorContext {
   private JavaType parameterType;
@@ -110,9 +111,12 @@ public class ParameterGeneratorContext extends OperationGeneratorContext {
     this.defaultValue = defaultValue;
   }
 
-  public void updateConsumes() {
+  public void updateConsumes(boolean isForm, boolean isBinary) {
     List<String> removed = new ArrayList<>();
     if (httpParameterType == HttpParameterType.BODY) {
+      if (isForm) {
+        throw new IllegalArgumentException("Both form and body parameter not allowed.");
+      }
       for (String media : supportedConsumes) {
         if (SUPPORTED_BODY_CONTENT_TYPE.contains(media)) {
           continue;
@@ -121,14 +125,38 @@ public class ParameterGeneratorContext extends OperationGeneratorContext {
       }
     } else if (httpParameterType == HttpParameterType.FORM) {
       for (String media : supportedConsumes) {
-        if (SUPPORTED_FORM_CONTENT_TYPE.contains(media)) {
+        if (!SUPPORTED_FORM_CONTENT_TYPE.contains(media)) {
+          removed.add(media);
           continue;
         }
-        removed.add(media);
+        if (isBinary && supportedConsumes.contains(MediaType.APPLICATION_FORM_URLENCODED)) {
+          removed.add(MediaType.APPLICATION_FORM_URLENCODED);
+        }
+        if (!isBinary && supportedConsumes.contains(MediaType.MULTIPART_FORM_DATA)) {
+          removed.add(MediaType.MULTIPART_FORM_DATA);
+        }
       }
     } else {
       supportedConsumes.clear();
     }
     supportedConsumes.removeAll(removed);
   }
+
+  public boolean isForm() {
+    return httpParameterType == HttpParameterType.FORM;
+  }
+
+  public boolean isBinary() {
+    if ("string".equals(this.schema.getType()) && "binary".equals(this.schema.getFormat())) {
+      return true;
+    }
+
+    return "array".equals(this.schema.getType()) &&
+        "string".equals(this.schema.getItems().getType()) &&
+        "binary".equals(this.schema.getItems().getFormat());
+  }
+
+  public boolean isObject() {
+    return "object".equals(this.schema.getType());
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
deleted file mode 100644
index 2fa5a596c..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/EnumPostProcessor.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import org.apache.servicecomb.swagger.generator.OperationPostProcessor;
-import org.apache.servicecomb.swagger.generator.core.AbstractOperationGenerator;
-import org.apache.servicecomb.swagger.generator.core.AbstractSwaggerGenerator;
-
-public class EnumPostProcessor implements OperationPostProcessor {
-  @Override
-  public boolean shouldProcess(AbstractSwaggerGenerator swaggerGenerator,
-      AbstractOperationGenerator operationGenerator) {
-    return true;
-  }
-
-  @Override
-  public void process(AbstractSwaggerGenerator swaggerGenerator, AbstractOperationGenerator operationGenerator) {
-    // TODO: dynamic enum tests
-//    for (ParameterGenerator parameterGenerator : operationGenerator.getParameterGenerators()) {
-//      if (parameterGenerator.getGeneratedParameter() != null) {
-//        processParameterDescription(parameterGenerator);
-//      }
-//    }
-//
-//    processResponseModelDescription(operationGenerator);
-  }
-
-//  private void processParameterDescription(ParameterGenerator parameterGenerator) {
-//    JavaType genericType = parameterGenerator.getGenericType();
-//    Annotation[] annotations = parameterGenerator.getAnnotations().toArray(new Annotation[0]);
-//    String description = generateDescription(genericType, annotations);
-//    if (description != null) {
-//      Parameter parameter = parameterGenerator
-//          .getGeneratedParameter();
-//      parameter.setDescription(description);
-//    }
-//  }
-//
-//  private String generateDescription(Type type, Annotation[] annotations) {
-//    JavaType javaType = TypeFactory.defaultInstance().constructType(type);
-//    if (javaType.isEnumType()) {
-//      return generateDescription(JDK, javaType.getRawClass(), annotations);
-//    }
-//
-//    if (javaType.isTypeOrSubTypeOf(DynamicEnum.class)) {
-//      return generateDescription(DYNAMIC, javaType.getRawClass(), annotations);
-//    }
-//
-//    return null;
-//  }
-//
-//  private String generateDescription(SwaggerEnum swaggerEnum, Class<?> enumClass, Annotation[] annotations) {
-//    return swaggerEnum.findPropertyDescription(enumClass, annotations);
-//  }
-//
-//  public void processResponseModelDescription(AbstractOperationGenerator operationGenerator) {
-//    String description = generateDescription(operationGenerator.getMethod().getReturnType(), null);
-//    if (description != null) {
-//      operationGenerator.getOperation().getResponses().get(String.valueOf(Status.OK.getStatusCode()))
-//          .getContent().get(MediaType.APPLICATION_JSON).getSchema()
-//          .setDescription(description);
-//    }
-//  }
-}
diff --git a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.OperationPostProcessor b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.OperationPostProcessor
deleted file mode 100644
index 3d854fa6f..000000000
--- a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.OperationPostProcessor
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.servicecomb.swagger.generator.core.processor.parameter.EnumPostProcessor
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
index 3c112e980..22be2a825 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
@@ -37,6 +37,7 @@ public class PathParamAnnotationProcessor extends JaxrsParameterProcessor<PathPa
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, PathParam annotation) {
     parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
+    parameterGenerator.getParameterGeneratorContext().setRequired(true);
     if (StringUtils.isNotEmpty(annotation.value())) {
       parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
index 03caae1db..a87b307ae 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/echo.yaml
@@ -101,6 +101,12 @@ paths:
           application/json:
             schema:
               type: string
+          application/protobuf:
+            schema:
+              type: string
+          text/plain:
+            schema:
+              type: string
         x-name: name
       responses:
         "200":
@@ -160,23 +166,15 @@ paths:
       parameters:
       - name: status-aggr
         in: query
-        description: |
-          dynamic desc aggr
-          - 400: dynamic bad request
-          - 404: dynamic not found
+        description: dynamic desc aggr
         required: false
-        explode: false
         schema:
           type: integer
           format: int32
       - name: status
         in: query
-        description: |
-          dynamic desc direct
-          - 400: dynamic bad request
-          - 404: dynamic not found
+        description: dynamic desc direct
         required: false
-        explode: false
         schema:
           type: integer
           format: int32
@@ -185,6 +183,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/DynamicStatusModel'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/DynamicStatusModel'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/DynamicStatusModel'
         x-name: model
       responses:
         "200":
@@ -193,9 +197,6 @@ paths:
             application/json:
               schema:
                 type: integer
-                description: |
-                  - 400: dynamic bad request
-                  - 404: dynamic not found
                 format: int32
   /echo/{targetName}:
     post:
@@ -219,6 +220,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/User'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/User'
         x-name: srcUser
       responses:
         "200":
@@ -245,6 +252,20 @@ paths:
               - RED
               - YELLOW
               - BLUE
+          application/protobuf:
+            schema:
+              type: string
+              enum:
+              - RED
+              - YELLOW
+              - BLUE
+          text/plain:
+            schema:
+              type: string
+              enum:
+              - RED
+              - YELLOW
+              - BLUE
         x-name: color
       responses:
         "200":
@@ -273,12 +294,8 @@ paths:
       parameters:
       - name: status-aggr
         in: query
-        description: |
-          jdk desc aggr
-          - BAD_REQUEST: jdk bad request
-          - NOT_FOUND: jdk not found
+        description: jdk desc aggr
         required: false
-        explode: false
         schema:
           type: string
           enum:
@@ -286,12 +303,8 @@ paths:
           - NOT_FOUND
       - name: status
         in: query
-        description: |
-          jdk desc direct
-          - BAD_REQUEST: jdk bad request
-          - NOT_FOUND: jdk not found
+        description: jdk desc direct
         required: false
-        explode: false
         schema:
           type: string
           enum:
@@ -302,6 +315,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/JdkStatusModel'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/JdkStatusModel'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/JdkStatusModel'
         x-name: model
       responses:
         "200":
@@ -310,9 +329,6 @@ paths:
             application/json:
               schema:
                 type: string
-                description: |
-                  - BAD_REQUEST: jdk bad request
-                  - NOT_FOUND: jdk not found
                 enum:
                 - BAD_REQUEST
                 - NOT_FOUND
@@ -328,6 +344,20 @@ paths:
                 type: array
                 items:
                   type: string
+          application/protobuf:
+            schema:
+              type: array
+              items:
+                type: array
+                items:
+                  type: string
+          text/plain:
+            schema:
+              type: array
+              items:
+                type: array
+                items:
+                  type: string
         x-name: param
       responses:
         "200":
@@ -386,7 +416,12 @@ paths:
           application/json:
             schema:
               type: string
-        required: true
+          application/protobuf:
+            schema:
+              type: string
+          text/plain:
+            schema:
+              type: string
         x-raw-json: true
         x-name: jsonInput
       responses:


[servicecomb-java-chassis] 02/12: [SCB-2803]refactoring swagger generator jaxrs to support many codec implementations

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 6da89ef8f47d2c2ee5059aec213adc9e8623d92a
Author: liubao <bi...@qq.com>
AuthorDate: Thu Aug 10 21:53:40 2023 +0800

    [SCB-2803]refactoring swagger generator jaxrs to support many codec implementations
---
 .../swagger/generator/ParameterGenerator.java      | 52 +++++++++-------
 .../generator/core/AbstractOperationGenerator.java | 17 +++--
 .../generator/core/AbstractSwaggerGenerator.java   |  4 +-
 .../generator/core/ParameterGeneratorContext.java  | 47 ++++++++++++++
 .../generator/core/SwaggerGeneratorContext.java    |  7 ++-
 .../parameter/PartArrayParameterTypeProcessor.java |  4 +-
 .../parameter/PartListParameterTypeProcessor.java  |  3 +-
 .../parameter/PartParameterTypeProcessor.java      |  4 +-
 ...swagger.generator.ParameterAnnotationProcessor} |  0
 .../annotation/CookieParamAnnotationProcessor.java | 40 +++---------
 .../annotation/FormParamAnnotationProcessor.java   | 72 +++-------------------
 .../annotation/HeaderParamAnnotationProcessor.java | 41 +++---------
 .../annotation/JaxrsParameterProcessor.java        |  4 +-
 .../annotation/PathParamAnnotationProcessor.java   | 41 +++---------
 .../annotation/QueryParamAnnotationProcessor.java  | 41 +++---------
 ...swagger.generator.ParameterAnnotationProcessor} |  0
 .../servicecomb/swagger/generator/jaxrs/Echo.java  |  6 --
 .../generator/jaxrs/TestClassAnnotation.java       |  8 ++-
 .../swagger/generator/jaxrs/TestJaxrs.java         | 20 +++++-
 .../test/resources/schemas/ClassAnnotation.yaml    | 63 +++++++++++++++++--
 .../parameter/MultipartFileArrayProcessor.java     |  4 +-
 .../parameter/MultipartFileListProcessor.java      |  3 +-
 22 files changed, 236 insertions(+), 245 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index ab6385634..c030e067c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -32,6 +32,7 @@ import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.ObjectSchema;
 import io.swagger.v3.oas.models.parameters.CookieParameter;
 import io.swagger.v3.oas.models.parameters.HeaderParameter;
 import io.swagger.v3.oas.models.parameters.Parameter;
@@ -42,19 +43,11 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
 public class ParameterGenerator {
   private final List<Annotation> annotations;
 
-  /**
-   * when wrap parameters to body, genericType is null
-   */
-  private final JavaType genericType;
-
-  private HttpParameterType httpParameterType;
-
   private final OperationGenerator operationGenerator;
 
   private final ParameterGeneratorContext parameterGeneratorContext;
 
   public ParameterGenerator(OperationGenerator operationGenerator, String parameterName) {
-    this.genericType = null;
     this.operationGenerator = operationGenerator;
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
@@ -73,9 +66,10 @@ public class ParameterGenerator {
         parameterName);
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
-    this.genericType = TypeFactory.defaultInstance()
-        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, genericType));
-    this.httpParameterType = SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType);
+    this.parameterGeneratorContext.setParameterType(TypeFactory.defaultInstance()
+        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, genericType)));
+    this.parameterGeneratorContext.setHttpParameterType(
+        SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType));
   }
 
   public ParameterGenerator(OperationGenerator operationGenerator, Executable executable,
@@ -93,9 +87,11 @@ public class ParameterGenerator {
     this.parameterGeneratorContext = new ParameterGeneratorContext(operationGenerator.getOperationGeneratorContext());
     this.parameterGeneratorContext.setParameterName(parameterName);
     this.annotations = annotations;
-    this.genericType = TypeFactory.defaultInstance()
-        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, null));
-    this.httpParameterType = SwaggerGeneratorUtils.collectHttpParameterType(annotations, genericType);
+    this.parameterGeneratorContext.setParameterType(TypeFactory.defaultInstance()
+        .constructType(SwaggerGeneratorUtils.collectGenericType(annotations, null)));
+    this.parameterGeneratorContext.setHttpParameterType(
+        SwaggerGeneratorUtils.collectHttpParameterType(annotations,
+            this.parameterGeneratorContext.getParameterType()));
   }
 
   public ParameterGeneratorContext getParameterGeneratorContext() {
@@ -107,19 +103,25 @@ public class ParameterGenerator {
   }
 
   public JavaType getGenericType() {
-    return genericType;
+    return this.parameterGeneratorContext.getParameterType();
   }
 
   public HttpParameterType getHttpParameterType() {
-    return httpParameterType;
+    return this.parameterGeneratorContext.getHttpParameterType();
   }
 
   public void setHttpParameterType(HttpParameterType httpParameterType) {
-    this.httpParameterType = httpParameterType;
+    this.parameterGeneratorContext.setHttpParameterType(httpParameterType);
   }
 
   public void generate() {
-    if (httpParameterType == HttpParameterType.BODY) {
+    this.parameterGeneratorContext.updateConsumes();
+
+    if (this.parameterGeneratorContext.getHttpParameterType() == HttpParameterType.BODY) {
+      if (parameterGeneratorContext.getSupportedConsumes().size() == 0) {
+        throw new IllegalArgumentException("Consumes not provided for BODY parameter, or is empty "
+            + "by annotations rule.");
+      }
       RequestBody requestBody = new RequestBody();
       Map<String, Object> extensions = new HashMap<>();
       extensions.put(SwaggerConst.EXT_BODY_NAME, parameterGeneratorContext.getParameterName());
@@ -133,7 +135,11 @@ public class ParameterGenerator {
       this.operationGenerator.getOperation().setRequestBody(requestBody);
       return;
     }
-    if (httpParameterType == HttpParameterType.FORM) {
+    if (this.parameterGeneratorContext.getHttpParameterType() == HttpParameterType.FORM) {
+      if (parameterGeneratorContext.getSupportedConsumes().size() == 0) {
+        throw new IllegalArgumentException("Consumes not provided for FORM parameter, or is empty "
+            + "by annotations rule.");
+      }
       RequestBody requestBody = this.operationGenerator.getOperation().getRequestBody();
       if (requestBody == null) {
         requestBody = new RequestBody();
@@ -144,6 +150,7 @@ public class ParameterGenerator {
         MediaType mediaType = requestBody.getContent().get(media);
         if (mediaType == null) {
           mediaType = new MediaType();
+          mediaType.setSchema(new ObjectSchema());
           requestBody.getContent().addMediaType(media, mediaType);
         }
         mediaType.getSchema().addProperty(parameterGeneratorContext.getParameterName(),
@@ -152,17 +159,18 @@ public class ParameterGenerator {
       return;
     }
     Parameter parameter;
-    switch (httpParameterType) {
+    switch (this.parameterGeneratorContext.getHttpParameterType()) {
       case PATH -> parameter = new PathParameter();
       case QUERY -> parameter = new QueryParameter();
       case HEADER -> parameter = new HeaderParameter();
       case COOKIE -> parameter = new CookieParameter();
-      default -> throw new IllegalStateException("not support httpParameterType " + httpParameterType);
+      default -> throw new IllegalStateException("not support httpParameterType "
+          + this.parameterGeneratorContext.getHttpParameterType());
     }
+    parameter.setName(parameterGeneratorContext.getParameterName());
     parameter.setSchema(parameterGeneratorContext.getSchema());
     parameter.setRequired(parameterGeneratorContext.getRequired());
     parameter.setExplode(parameterGeneratorContext.getExplode());
-    parameter.setIn(httpParameterType.name());
     this.operationGenerator.getOperation().addParametersItem(parameter);
 
     // validations and other annotations supported by swagger default
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index a932c8258..97c09936e 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -181,14 +181,21 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     initParameterGenerators();
 
     Set<String> names = new HashSet<>();
+    int bodyCount = 0;
     for (ParameterGenerator parameterGenerator : parameterGenerators) {
       scanMethodParameter(parameterGenerator);
 
       if (!names.add(parameterGenerator.getParameterGeneratorContext().getParameterName())) {
-        throw new IllegalStateException(
+        throw new IllegalArgumentException(
             String.format("not support duplicated parameter, name=%s.",
                 parameterGenerator.getParameterGeneratorContext().getParameterName()));
       }
+      if (parameterGenerator.getHttpParameterType() == HttpParameterType.BODY) {
+        if (bodyCount > 0) {
+          throw new IllegalArgumentException(String.format("Defined %d body parameter.", bodyCount));
+        }
+        bodyCount++;
+      }
       parameterGenerator.generate();
     }
   }
@@ -203,14 +210,6 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
 
     // 3.create ParameterGenerators remains method annotations
     initRemainMethodAnnotationsParameterGenerators(methodAnnotationMap);
-
-    // 4.check
-    //   httpParameterType should not be null
-    long bodyCount = parameterGenerators.stream().filter(p -> p.getHttpParameterType().equals(HttpParameterType.BODY))
-        .count();
-    if (bodyCount > 1) {
-      throw new IllegalStateException(String.format("defined %d body parameter.", bodyCount));
-    }
   }
 
   protected void initMethodParameterGenerators(Map<String, List<Annotation>> methodAnnotationMap) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
index a74a9feda..fe219b34a 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
@@ -235,8 +235,8 @@ public abstract class AbstractSwaggerGenerator implements SwaggerGenerator {
       try {
         operationGenerator.generate();
       } catch (Throwable e) {
-        String msg = String
-            .format("generate swagger operation failed, method=%s:%s.", this.cls.getName(), method.getName());
+        String msg = String.format("generate swagger operation failed, method=%s:%s.",
+            this.cls.getName(), method.getName());
         throw new IllegalStateException(msg, e);
       }
 
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
index 09364a0f7..adf9f849b 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/ParameterGeneratorContext.java
@@ -16,6 +16,11 @@
  */
 package org.apache.servicecomb.swagger.generator.core;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
+
 import com.fasterxml.jackson.databind.JavaType;
 
 import io.swagger.v3.oas.models.media.Schema;
@@ -25,10 +30,14 @@ public class ParameterGeneratorContext extends OperationGeneratorContext {
 
   private String parameterName;
 
+  private HttpParameterType httpParameterType;
+
   private Boolean explode;
 
   private Boolean required;
 
+  private Object defaultValue;
+
   private Boolean rawJson;
 
   private Schema<?> schema;
@@ -84,4 +93,42 @@ public class ParameterGeneratorContext extends OperationGeneratorContext {
   public void setSchema(Schema<?> schema) {
     this.schema = schema;
   }
+
+  public HttpParameterType getHttpParameterType() {
+    return httpParameterType;
+  }
+
+  public void setHttpParameterType(HttpParameterType httpParameterType) {
+    this.httpParameterType = httpParameterType;
+  }
+
+  public Object getDefaultValue() {
+    return defaultValue;
+  }
+
+  public void setDefaultValue(Object defaultValue) {
+    this.defaultValue = defaultValue;
+  }
+
+  public void updateConsumes() {
+    List<String> removed = new ArrayList<>();
+    if (httpParameterType == HttpParameterType.BODY) {
+      for (String media : supportedConsumes) {
+        if (SUPPORTED_BODY_CONTENT_TYPE.contains(media)) {
+          continue;
+        }
+        removed.add(media);
+      }
+    } else if (httpParameterType == HttpParameterType.FORM) {
+      for (String media : supportedConsumes) {
+        if (SUPPORTED_FORM_CONTENT_TYPE.contains(media)) {
+          continue;
+        }
+        removed.add(media);
+      }
+    } else {
+      supportedConsumes.clear();
+    }
+    supportedConsumes.removeAll(removed);
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
index 10806dab8..837499dad 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGeneratorContext.java
@@ -28,11 +28,16 @@ import jakarta.ws.rs.core.MediaType;
  * Context information to help generate specific open api parts.
  */
 public class SwaggerGeneratorContext {
-  // TODO: may initialized by different codec implementations
   protected static final List<String> SUPPORTED_CONTENT_TYPE
       = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN,
       MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_FORM_URLENCODED);
 
+  protected static final List<String> SUPPORTED_BODY_CONTENT_TYPE
+      = Arrays.asList(MediaType.APPLICATION_JSON, SwaggerConst.PROTOBUF_TYPE, MediaType.TEXT_PLAIN);
+
+  protected static final List<String> SUPPORTED_FORM_CONTENT_TYPE
+      = Arrays.asList(MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_FORM_URLENCODED);
+
   protected List<String> supportedConsumes;
 
   protected List<String> supportedProduces;
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
index cedbfe038..1d992ab9e 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartArrayParameterTypeProcessor.java
@@ -20,6 +20,8 @@ import java.lang.reflect.Type;
 
 import org.apache.servicecomb.swagger.generator.ParameterGenerator;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
 import io.swagger.v3.oas.models.media.ArraySchema;
 import io.swagger.v3.oas.models.media.FileSchema;
 import jakarta.servlet.http.Part;
@@ -27,7 +29,7 @@ import jakarta.servlet.http.Part;
 public class PartArrayParameterTypeProcessor extends PartParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return Part[].class;
+    return TypeFactory.defaultInstance().constructType(Part[].class);
   }
 
   @Override
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
index cb4eeb39a..bfd79c512 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartListParameterTypeProcessor.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.swagger.generator.core.processor.parameter;
 import java.lang.reflect.Type;
 import java.util.List;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.google.inject.util.Types;
 
 import jakarta.servlet.http.Part;
@@ -26,6 +27,6 @@ import jakarta.servlet.http.Part;
 public class PartListParameterTypeProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return Types.newParameterizedType(List.class, Part.class);
+    return TypeFactory.defaultInstance().constructType(Types.newParameterizedType(List.class, Part.class));
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
index 9605db3f0..304d34fe0 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
@@ -27,6 +27,8 @@ import org.apache.servicecomb.swagger.generator.ParameterTypeProcessor;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
 import io.swagger.v3.oas.models.Operation;
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.FileSchema;
@@ -38,7 +40,7 @@ import jakarta.ws.rs.core.MediaType;
 public class PartParameterTypeProcessor implements ParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return Part.class;
+    return TypeFactory.defaultInstance().constructType(Part.class);
   }
 
   @Override
diff --git a/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor b/swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
similarity index 100%
rename from swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.SwaggerParameterAnnotationProcessor
rename to swagger/swagger-generator/generator-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
index 1afa3efee..51467e936 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/CookieParamAnnotationProcessor.java
@@ -19,16 +19,12 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.CookieParam;
 
 public class CookieParamAnnotationProcessor extends
@@ -39,29 +35,11 @@ public class CookieParamAnnotationProcessor extends
   }
 
   @Override
-  public String getParameterName(CookieParam parameterAnnotation) {
-    return parameterAnnotation.value();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(CookieParam parameterAnnotation) {
-    return HttpParameterType.COOKIE;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter cookieParameter, JavaType type,
-      CookieParam cookieParam) {
-    Schema schema = cookieParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      cookieParameter.setSchema(schema);
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, CookieParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
-    cookieParameter.setName(cookieParam.value());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter, String parameterName,
-      JavaType type, CookieParam cookieParam) {
-
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
index 1edd9c215..106f90ac4 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/FormParamAnnotationProcessor.java
@@ -18,25 +18,15 @@
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
-import java.util.LinkedHashMap;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.MapSchema;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-import jakarta.servlet.http.Part;
 import jakarta.ws.rs.FormParam;
 
-@SuppressWarnings({"rawtypes", "unchecked"})
 public class FormParamAnnotationProcessor extends JaxrsParameterProcessor<FormParam> {
   @Override
   public Type getProcessType() {
@@ -44,55 +34,11 @@ public class FormParamAnnotationProcessor extends JaxrsParameterProcessor<FormPa
   }
 
   @Override
-  public String getParameterName(FormParam parameterAnnotation) {
-    return parameterAnnotation.value();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(FormParam parameterAnnotation) {
-    return HttpParameterType.FORM;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      FormParam formParam) {
-
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, FormParam formParam) {
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, FormParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.FORM);
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
-
-    String mediaType = SwaggerConst.FORM_MEDIA_TYPE;
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE) != null || isPart(type)) {
-      mediaType = SwaggerConst.FILE_MEDIA_TYPE;
-    }
-
-    if (requestBody.getContent().get(mediaType) == null) {
-      requestBody.getContent().addMediaType(mediaType,
-          new io.swagger.v3.oas.models.media.MediaType());
-    }
-    if (requestBody.getContent().get(mediaType).getSchema() == null) {
-      requestBody.getContent().get(mediaType)
-          .setSchema(new MapSchema());
-    }
-    if (requestBody.getContent().get(mediaType).getSchema().getProperties() == null) {
-      requestBody.getContent().get(mediaType)
-          .getSchema().setProperties(new LinkedHashMap<>());
-    }
-
-    // FormParam used with Part and simple types.
-    // Part is processed by type processor.
-    if (!isPart(type)) {
-      Schema schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      requestBody.getContent().get(mediaType).getSchema().getProperties().put(parameterName, schema);
-    }
-  }
-
-  private boolean isPart(JavaType type) {
-    return Part.class.equals(type.getRawClass());
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
index 2d917317e..770fc1fbe 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/HeaderParamAnnotationProcessor.java
@@ -19,19 +19,14 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.HeaderParam;
 
-@SuppressWarnings("rawtypes")
 public class HeaderParamAnnotationProcessor extends
     JaxrsParameterProcessor<HeaderParam> {
   @Override
@@ -40,29 +35,11 @@ public class HeaderParamAnnotationProcessor extends
   }
 
   @Override
-  public String getParameterName(HeaderParam annotation) {
-    return annotation.value();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(HeaderParam parameterAnnotation) {
-    return HttpParameterType.HEADER;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter headerParameter, JavaType type,
-      HeaderParam headerParam) {
-    Schema schema = headerParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      headerParameter.setSchema(schema);
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, HeaderParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.HEADER);
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
-    headerParameter.setName(headerParam.value());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter,
-      String parameterName, JavaType type, HeaderParam headerParam) {
-
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
index db5f22ade..ccb271cb9 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterProcessor.java
@@ -17,8 +17,8 @@
 
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
+import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 
 public abstract class JaxrsParameterProcessor<ANNOTATION> implements
-    ParameterProcessor<ANNOTATION> {
+    ParameterAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
index b856a1bfd..3c112e980 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathParamAnnotationProcessor.java
@@ -19,19 +19,14 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.PathParam;
 
-@SuppressWarnings("rawtypes")
 public class PathParamAnnotationProcessor extends JaxrsParameterProcessor<PathParam> {
   @Override
   public Type getProcessType() {
@@ -39,29 +34,11 @@ public class PathParamAnnotationProcessor extends JaxrsParameterProcessor<PathPa
   }
 
   @Override
-  public String getParameterName(PathParam parameterAnnotation) {
-    return parameterAnnotation.value();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(PathParam parameterAnnotation) {
-    return HttpParameterType.PATH;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter pathParameter, JavaType type,
-      PathParam pathParam) {
-    Schema schema = pathParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      pathParameter.setSchema(schema);
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, PathParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
-    pathParameter.setName(pathParam.value());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter, String parameterName,
-      JavaType type, PathParam pathParam) {
-
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
index 23cd33ffc..be9517d63 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/QueryParamAnnotationProcessor.java
@@ -19,19 +19,14 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import jakarta.ws.rs.QueryParam;
 
-@SuppressWarnings("rawtypes")
 public class QueryParamAnnotationProcessor extends JaxrsParameterProcessor<QueryParam> {
   @Override
   public Type getProcessType() {
@@ -39,29 +34,11 @@ public class QueryParamAnnotationProcessor extends JaxrsParameterProcessor<Query
   }
 
   @Override
-  public String getParameterName(QueryParam parameterAnnotation) {
-    return parameterAnnotation.value();
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(QueryParam parameterAnnotation) {
-    return HttpParameterType.QUERY;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter queryParameter, JavaType type,
-      QueryParam queryParam) {
-    Schema schema = queryParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      queryParameter.setSchema(schema);
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, QueryParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.QUERY);
+    if (StringUtils.isNotEmpty(annotation.value())) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(annotation.value());
     }
-    queryParameter.setName(queryParam.value());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, QueryParam queryParam) {
-
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor b/swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
similarity index 100%
rename from swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterProcessor
rename to swagger/swagger-generator/generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
index 527b477e7..67a8ac39c 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/Echo.java
@@ -41,7 +41,6 @@ import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import jakarta.ws.rs.BeanParam;
-import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.CookieParam;
 import jakarta.ws.rs.FormParam;
 import jakarta.ws.rs.GET;
@@ -50,7 +49,6 @@ import jakarta.ws.rs.PATCH;
 import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
 import jakarta.ws.rs.core.Response;
 
@@ -70,8 +68,6 @@ public class Echo {
   }
 
   @POST
-  @Produces("")
-  @Consumes("")
   @Operation(summary = "")
   @Path("emptyPath")
   public void emptyPath() {
@@ -79,8 +75,6 @@ public class Echo {
   }
 
   @Path(value = "echo/{targetName}")
-  @Consumes(value = {"json", "xml"})
-  @Produces(value = {"json", "xml"})
   @POST
   public String echo(User srcUser, @HeaderParam(value = "header") String header,
       @PathParam(value = "targetName") String targetName,
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
index f910cc241..7dfb379f2 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestClassAnnotation.java
@@ -28,13 +28,17 @@ public class TestClassAnnotation {
 
   @Test
   public void test_form_wrong() {
-    UnitTestSwaggerUtils.testException("wrong", ClassAnnotation.class,
+    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
+            + "method=org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation:testFormWrong.",
+        ClassAnnotation.class,
         "testFormWrong");
   }
 
   @Test
   public void test_upload_wrong() {
-    UnitTestSwaggerUtils.testException("wrong", ClassAnnotation.class,
+    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
+            + "method=org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation:testUploadWrong.",
+        ClassAnnotation.class,
         "testUploadWrong");
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
index 4f2d1089d..0888b3389 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/TestJaxrs.java
@@ -49,7 +49,23 @@ public class TestJaxrs {
   }
 
   @Test
-  public void consumesAndProduces() {
-    UnitTestSwaggerUtils.testSwagger("schemas/consumes.yaml", ConsumesAndProduces.class);
+  public void consumesAndProduces_exception_testSingleMediaType() {
+    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
+            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testSingleMediaType.",
+        ConsumesAndProduces.class, "testSingleMediaType");
+  }
+
+  @Test
+  public void consumesAndProduces_exception_testMultipleMediaType() {
+    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
+            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testMultipleMediaType.",
+        ConsumesAndProduces.class, "testMultipleMediaType");
+  }
+
+  @Test
+  public void consumesAndProduces_exception_testBlankMediaType() {
+    UnitTestSwaggerUtils.testException("generate swagger operation failed, "
+            + "method=org.apache.servicecomb.swagger.generator.jaxrs.model.ConsumesAndProduces:testBlankMediaType.",
+        ConsumesAndProduces.class, "testBlankMediaType");
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
index 35b60c51b..a1c4739d5 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/resources/schemas/ClassAnnotation.yaml
@@ -15,22 +15,77 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
+---
 openapi: 3.0.1
 info:
   title: swagger definition for org.apache.servicecomb.swagger.generator.jaxrs.ClassAnnotation
   version: 1.0.0
 servers:
-  - url: /class
+- url: /class
 paths:
-  /cookie:
+  /testBean:
     post:
-      operationId: cookie
+      operationId: testBean
       requestBody:
         content:
           application/json:
             schema:
               $ref: '#/components/schemas/User'
         x-name: user
+      responses:
+        "200":
+          description: response of 200
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/User'
+  /testForm:
+    post:
+      operationId: testForm
+      requestBody:
+        content:
+          application/x-www-form-urlencoded:
+            schema:
+              type: object
+              properties:
+                param:
+                  type: integer
+                  format: int32
+      responses:
+        "200":
+          description: response of 200
+          content:
+            application/json:
+              schema:
+                type: string
+  /testString:
+    post:
+      operationId: testString
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: string
+        x-name: user
+      responses:
+        "200":
+          description: response of 200
+          content:
+            application/json:
+              schema:
+                type: string
+  /testUpload:
+    post:
+      operationId: testUpload
+      requestBody:
+        content:
+          multipart/form-data:
+            schema:
+              type: object
+              properties:
+                part:
+                  type: string
+                  format: binary
       responses:
         "200":
           description: response of 200
@@ -49,4 +104,4 @@ components:
           type: array
           items:
             $ref: '#/components/schemas/User'
-      x-java-class: org.apache.servicecomb.foundation.test.scaffolding.model.User
+      x-java-class: org.apache.servicecomb.foundation.test.scaffolding.model.User
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
index 2849c1cf2..b32c1b49c 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileArrayProcessor.java
@@ -22,9 +22,11 @@ import java.lang.reflect.Type;
 import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
 public class MultipartFileArrayProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return MultipartFile[].class;
+    return TypeFactory.defaultInstance().constructType(MultipartFile[].class);
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
index 41be450a7..8b7f997de 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListProcessor.java
@@ -23,11 +23,12 @@ import java.util.List;
 import org.apache.servicecomb.swagger.generator.core.processor.parameter.PartArrayParameterTypeProcessor;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.google.inject.util.Types;
 
 public class MultipartFileListProcessor extends PartArrayParameterTypeProcessor {
   @Override
   public Type getProcessType() {
-    return Types.newParameterizedType(List.class, MultipartFile.class);
+    return TypeFactory.defaultInstance().constructType(Types.newParameterizedType(List.class, MultipartFile.class));
   }
 }


[servicecomb-java-chassis] 05/12: [SCB-2803]refactor springmvc parameter processors

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit d4567e69e03f21b816365c3c427ffb73e78d6b1d
Author: liubao <bi...@qq.com>
AuthorDate: Fri Aug 11 11:09:36 2023 +0800

    [SCB-2803]refactor springmvc parameter processors
---
 .../parameter/AbstractParameterProcessor.java      | 24 -------
 .../JaxrsParameterAnnotationProcessor.java         |  3 +
 .../annotation/CookieValueAnnotationProcessor.java | 51 +++++---------
 .../PathVariableAnnotationProcessor.java           | 45 ++++---------
 .../RequestAttributeAnnotationProcessor.java       | 61 ++++-------------
 .../annotation/RequestBodyAnnotationProcessor.java | 36 +++-------
 .../RequestHeaderAnnotationProcessor.java          | 52 +++++----------
 .../annotation/RequestParamParameterProcessor.java | 52 +++++----------
 .../annotation/RequestPartAnnotationProcessor.java | 77 ++++------------------
 ...=> SpringmvcParameterAnnotationsProcessor.java} | 11 ++--
 10 files changed, 97 insertions(+), 315 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
deleted file mode 100644
index 7712564d8..000000000
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.swagger.generator.core.processor.parameter;
-
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
-
-public abstract class AbstractParameterProcessor<ANNOTATION> implements
-    ParameterProcessor<ANNOTATION> {
-}
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
index 733633532..126f48b31 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/JaxrsParameterAnnotationProcessor.java
@@ -19,6 +19,9 @@ package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
 import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 
+/**
+ * A generic class to help classify implementations.
+ */
 public abstract class JaxrsParameterAnnotationProcessor<ANNOTATION> implements
     ParameterAnnotationProcessor<ANNOTATION> {
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
index a3da3bd65..b2d04cdd0 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
@@ -19,59 +19,38 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.CookieValue;
 import org.springframework.web.bind.annotation.ValueConstants;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-@SuppressWarnings("rawtypes")
 public class CookieValueAnnotationProcessor extends
-    AbstractSpringmvcParameterProcessor<CookieValue> {
+    SpringmvcParameterAnnotationsProcessor<CookieValue> {
   @Override
   public Type getProcessType() {
     return CookieValue.class;
   }
 
   @Override
-  public String getParameterName(CookieValue annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, CookieValue annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(CookieValue parameterAnnotation) {
-    return HttpParameterType.COOKIE;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation,
-      io.swagger.v3.oas.models.parameters.Parameter parameter, JavaType type, CookieValue cookieValue) {
-    Schema schema = parameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      parameter.setSchema(schema);
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    parameter.setRequired(cookieValue.required());
-    if (!ValueConstants.DEFAULT_NONE.equals(cookieValue.defaultValue())) {
-      schema.setDefault(cookieValue.defaultValue());
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
+    if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
+      parameterGenerator.getParameterGeneratorContext()
+          .setDefaultValue(annotation.defaultValue());
       // if default value is set, must be required false.
-      parameter.setRequired(false);
+      parameterGenerator.getParameterGeneratorContext().setRequired(false);
     }
   }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody parameter, String parameterName,
-      JavaType type, CookieValue cookieValue) {
-
-  }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
index e8cf9a366..2c4b20313 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
@@ -19,54 +19,31 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.PathVariable;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-@SuppressWarnings("rawtypes")
 public class PathVariableAnnotationProcessor extends
-    AbstractSpringmvcParameterProcessor<PathVariable> {
+    SpringmvcParameterAnnotationsProcessor<PathVariable> {
   @Override
   public Type getProcessType() {
     return PathVariable.class;
   }
 
   @Override
-  public String getParameterName(PathVariable annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, PathVariable annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.PATH);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(PathVariable parameterAnnotation) {
-    return HttpParameterType.PATH;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter pathParameter, JavaType type,
-      PathVariable pathVariable) {
-    Schema schema = pathParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      pathParameter.setSchema(schema);
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    pathParameter.setRequired(pathVariable.required());
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, PathVariable pathVariable) {
-
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
index b2ac63a7e..646d11283 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
@@ -19,21 +19,13 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.RequestAttribute;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.MapSchema;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
 /**
  * Use RequestAttribute to annotate a Form parameter.
  *
@@ -41,55 +33,24 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
  * to annotate query param and form param. This is implementation based. We can't use RequestParam to express
  * both query and form in OpenAPI 3.0. And there is no request attribute.
  */
-@SuppressWarnings("rawtypes")
 public class RequestAttributeAnnotationProcessor extends
-    AbstractSpringmvcParameterProcessor<RequestAttribute> {
+    SpringmvcParameterAnnotationsProcessor<RequestAttribute> {
   @Override
   public Type getProcessType() {
     return RequestAttribute.class;
   }
 
   @Override
-  public String getParameterName(RequestAttribute annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestAttribute annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RequestAttribute parameterAnnotation) {
-    return HttpParameterType.FORM;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      RequestAttribute requestAttribute) {
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, RequestAttribute requestAttribute) {
-    Schema schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
-    }
-
-    String mediaType = SwaggerConst.FORM_MEDIA_TYPE;
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE) != null) {
-      mediaType = SwaggerConst.FILE_MEDIA_TYPE;
-    }
-
-    if (requestBody.getContent().get(mediaType) == null) {
-      requestBody.getContent().addMediaType(mediaType,
-          new io.swagger.v3.oas.models.media.MediaType());
-    }
-    if (requestBody.getContent().get(mediaType).getSchema() == null) {
-      requestBody.getContent().get(mediaType)
-          .setSchema(new MapSchema());
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    requestBody.getContent().get(mediaType)
-        .getSchema().addProperty(getParameterName(requestAttribute), schema);
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
index da38edaa6..700b150b6 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestBodyAnnotationProcessor.java
@@ -19,42 +19,24 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.generator.ParameterProcessor;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.RequestBody;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.parameters.Parameter;
-
-public class RequestBodyAnnotationProcessor implements ParameterProcessor<RequestBody> {
+public class RequestBodyAnnotationProcessor extends
+    SpringmvcParameterAnnotationsProcessor<RequestBody> {
   @Override
   public Type getProcessType() {
     return RequestBody.class;
   }
 
-  @Override
-  public String getParameterName(RequestBody parameterAnnotation) {
-    return null;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RequestBody parameterAnnotation) {
-    return HttpParameterType.BODY;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      RequestBody requestBody) {
-
-  }
 
   @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation,
-      io.swagger.v3.oas.models.parameters.RequestBody bodyParameter, String parameterName, JavaType type,
-      RequestBody requestBody) {
-    bodyParameter.setRequired(requestBody.required());
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestBody annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.BODY);
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
index 27e3deef5..13ef18537 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
@@ -19,60 +19,38 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.ValueConstants;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-@SuppressWarnings("rawtypes")
 public class RequestHeaderAnnotationProcessor extends
-    AbstractSpringmvcParameterProcessor<RequestHeader> {
+    SpringmvcParameterAnnotationsProcessor<RequestHeader> {
   @Override
   public Type getProcessType() {
     return RequestHeader.class;
   }
 
   @Override
-  public String getParameterName(RequestHeader annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestHeader annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RequestHeader parameterAnnotation) {
-    return HttpParameterType.HEADER;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter headerParameter, JavaType type,
-      RequestHeader requestHeader) {
-    Schema schema = headerParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      headerParameter.setSchema(schema);
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    headerParameter.setRequired(requestHeader.required());
-    if (!ValueConstants.DEFAULT_NONE.equals(requestHeader.defaultValue())) {
-      schema.setDefault(requestHeader.defaultValue());
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
+    if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
+      parameterGenerator.getParameterGeneratorContext()
+          .setDefaultValue(annotation.defaultValue());
       // if default value is set, must be required false.
-      headerParameter.setRequired(false);
+      parameterGenerator.getParameterGeneratorContext().setRequired(false);
     }
   }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, RequestHeader requestHeader) {
-
-  }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
index 74051b4ca..afb7e80de 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamParameterProcessor.java
@@ -19,19 +19,14 @@ package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ValueConstants;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
 /**
  * Use RequestParam to annotate a Query parameter.
  *
@@ -39,47 +34,30 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
  * This is implementation based. We can't use RequestParam to express
  * both query and form in OpenAPI 3.0.
  */
-@SuppressWarnings("rawtypes")
 public class RequestParamParameterProcessor extends
-    AbstractSpringmvcParameterProcessor<RequestParam> {
+    SpringmvcParameterAnnotationsProcessor<RequestParam> {
   @Override
   public Type getProcessType() {
     return RequestParam.class;
   }
 
   @Override
-  public String getParameterName(RequestParam annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestParam annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RequestParam parameterAnnotation) {
-    return HttpParameterType.QUERY;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter queryParameter, JavaType type,
-      RequestParam requestParam) {
-    Schema schema = queryParameter.getSchema();
-    if (schema == null) {
-      schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-      queryParameter.setSchema(schema);
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    queryParameter.setRequired(requestParam.required());
-    if (!ValueConstants.DEFAULT_NONE.equals(requestParam.defaultValue())) {
-      schema.setDefault(requestParam.defaultValue());
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
+    if (!ValueConstants.DEFAULT_NONE.equals(annotation.defaultValue())) {
+      parameterGenerator.getParameterGeneratorContext()
+          .setDefaultValue(annotation.defaultValue());
       // if default value is set, must be required false.
-      queryParameter.setRequired(false);
+      parameterGenerator.getParameterGeneratorContext().setRequired(false);
     }
   }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, RequestParam requestParam) {
-
-  }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
index 08dd78d06..f99cfeb66 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
@@ -18,87 +18,32 @@
 package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.lang.reflect.Type;
-import java.util.LinkedHashMap;
-import java.util.List;
 
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.ParameterGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.model.HttpParameterType;
 import org.springframework.web.bind.annotation.RequestPart;
-import org.springframework.web.multipart.MultipartFile;
 
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-import io.swagger.v3.oas.models.media.Content;
-import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.RequestBody;
-
-@SuppressWarnings({"rawtypes", "unchecked"})
 public class RequestPartAnnotationProcessor extends
-    AbstractSpringmvcParameterProcessor<RequestPart> {
+    SpringmvcParameterAnnotationsProcessor<RequestPart> {
   @Override
   public Type getProcessType() {
     return RequestPart.class;
   }
 
   @Override
-  public String getParameterName(RequestPart annotation) {
+  public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      ParameterGenerator parameterGenerator, RequestPart annotation) {
+    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
     String value = annotation.value();
     if (value.isEmpty()) {
       value = annotation.name();
     }
-    return value;
-  }
-
-  @Override
-  public HttpParameterType getHttpParameterType(RequestPart parameterAnnotation) {
-    return HttpParameterType.FORM;
-  }
-
-  @Override
-  public void fillParameter(OpenAPI swagger, Operation operation, Parameter parameter, JavaType type,
-      RequestPart requestPart) {
-
-  }
-
-  @Override
-  public void fillRequestBody(OpenAPI swagger, Operation operation, RequestBody requestBody, String parameterName,
-      JavaType type, RequestPart requestPart) {
-    if (requestBody.getContent() == null) {
-      requestBody.setContent(new Content());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE) == null) {
-      requestBody.getContent().addMediaType(SwaggerConst.FILE_MEDIA_TYPE,
-          new io.swagger.v3.oas.models.media.MediaType());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema() == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE)
-          .setSchema(new Schema<>());
-    }
-    if (requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema().getProperties() == null) {
-      requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE)
-          .getSchema().setProperties(new LinkedHashMap<>());
-    }
-    // RequestPart used with MultipartFile and simple types.
-    // MultipartFile is processed by type processor.
-    if (isPart(type)) {
-      return;
-    }
-    Schema schema = SwaggerUtils.resolveTypeSchemas(swagger, type);
-    requestBody.getContent().get(SwaggerConst.FILE_MEDIA_TYPE).getSchema().getProperties().put(parameterName, schema);
-  }
-
-  private boolean isPart(JavaType type) {
-    if (MultipartFile.class.equals(type.getRawClass())) {
-      return true;
-    }
-    if (MultipartFile[].class.equals(type.getRawClass())) {
-      return true;
+    if (StringUtils.isNotEmpty(value)) {
+      parameterGenerator.getParameterGeneratorContext().setParameterName(value);
     }
-    return type.getContentType() != null &&
-        List.class.equals(type.getRawClass()) && MultipartFile.class.equals(type.getContentType().getRawClass());
+    parameterGenerator.getParameterGeneratorContext().setRequired(annotation.required());
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractSpringmvcParameterProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/SpringmvcParameterAnnotationsProcessor.java
similarity index 76%
rename from swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractSpringmvcParameterProcessor.java
rename to swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/SpringmvcParameterAnnotationsProcessor.java
index a4065f217..6b908c327 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractSpringmvcParameterProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/SpringmvcParameterAnnotationsProcessor.java
@@ -14,11 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
-import org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
+import org.apache.servicecomb.swagger.generator.ParameterAnnotationProcessor;
 
-public abstract class AbstractSpringmvcParameterProcessor<ANNOTATION> extends
-    AbstractParameterProcessor<ANNOTATION> {
+/**
+ * A generic class to help classify implementations.
+ */
+public abstract class SpringmvcParameterAnnotationsProcessor<ANNOTATION> implements
+    ParameterAnnotationProcessor<ANNOTATION> {
 }
+


[servicecomb-java-chassis] 11/12: [SCB-2803]fix problems in all test cases

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 697af915a574c4ad9dd5472851fc65152272984c
Author: liubao <bi...@qq.com>
AuthorDate: Tue Aug 15 20:41:24 2023 +0800

    [SCB-2803]fix problems in all test cases
---
 .../converter/SwaggerToProtoGenerator.java         | 39 ++++++++--------
 .../internal/converter/model/ProtoSchema.java      |  6 +++
 .../src/test/resources/ProtoSchema.proto           | 21 +++++++--
 .../rest/codec/param/BodyProcessorCreator.java     |  3 +-
 .../rest/filter/inner/RestServerCodecFilter.java   |  2 +-
 .../rest/definition/TestRestOperationMeta.java     | 52 ++++++++++------------
 .../edge/consumer/EdgeServiceGovernanceTest.java   |  4 +-
 .../demo/jaxrs/client/TestFileUploadSchema.java    |  7 ++-
 .../demo/jaxrs/server/CodeFirstJaxrs.java          |  9 ----
 .../resources/microservices/jaxrs/compute.yaml     | 22 +++++++--
 .../schemas/CodeFirstSpringmvcForSchema.yaml       | 10 ++++-
 .../apache/servicecomb/swagger/SwaggerUtils.java   |  2 +
 .../src/test/resources/pageSchema.yaml             | 12 +++++
 .../RequestAttributeAnnotationProcessor.java       |  2 +-
 .../springmvc/MethodMixupAnnotations.java          |  8 +++-
 .../test/resources/schemas/mixupAnnotations.yaml   | 26 +++++++++++
 .../swagger/invocation/response/ResponsesMeta.java | 14 ++----
 .../invocation/response/TestResponsesMeta.java     |  2 +-
 .../TestConsumerResponseMapperFactorys.java        |  6 ++-
 .../TestProducerResponseMapperFactorys.java        |  4 +-
 .../response/TestJaxrsConsumerResponseMapper.java  |  3 +-
 21 files changed, 164 insertions(+), 90 deletions(-)

diff --git a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
index 954c57a76..a9333148e 100644
--- a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
+++ b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
@@ -372,14 +372,15 @@ public class SwaggerToProtoGenerator {
       }
     }
     if (operation.getRequestBody() != null
-        && operation.getRequestBody().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE) != null) {
-      properties.put((String) operation.getRequestBody().getExtensions().get(SwaggerConst.EXT_BODY_NAME),
-          operation.getRequestBody().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE).getSchema());
-    }
-    if (operation.getRequestBody() != null
-        && operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE) != null) {
-      operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE).getSchema().getProperties()
-          .forEach((k, v) -> properties.put((String) k, (Schema) v));
+        && operation.getRequestBody().getContent().size() != 0) {
+      if (operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE) != null) {
+        operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE).getSchema().getProperties()
+            .forEach((k, v) -> properties.put((String) k, (Schema) v));
+      } else {
+        properties.put((String) operation.getRequestBody().getExtensions().get(SwaggerConst.EXT_BODY_NAME),
+            operation.getRequestBody().getContent().get(
+                operation.getRequestBody().getContent().keySet().iterator().next()).getSchema());
+      }
     }
     return properties;
   }
@@ -388,22 +389,23 @@ public class SwaggerToProtoGenerator {
     if (operation.getParameters() != null && operation.getParameters().size() == 1) {
       return operation.getParameters().get(0).getSchema();
     }
-    if (operation.getRequestBody().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE) != null) {
-      return operation.getRequestBody().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE).getSchema();
+    if (operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE) != null) {
+      return (Schema) operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE).getSchema()
+          .getProperties()
+          .values().iterator().next();
     }
-    return (Schema) operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE).getSchema()
-        .getProperties()
-        .values().iterator().next();
+    return operation.getRequestBody().getContent().get(
+        operation.getRequestBody().getContent().keySet().iterator().next()).getSchema();
   }
 
   private int parametersCount(Operation operation) {
     int parameters = operation.getParameters() == null ? 0 : operation.getParameters().size();
     if (operation.getRequestBody() != null) {
-      if (operation.getRequestBody().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE) != null) {
-        parameters = parameters + 1;
-      } else if (operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE) != null) {
+      if (operation.getRequestBody().getContent().get(SwaggerConst.FORM_MEDIA_TYPE) != null) {
         parameters = parameters + operation.getRequestBody()
             .getContent().get(SwaggerConst.FORM_MEDIA_TYPE).getSchema().getProperties().size();
+      } else if (operation.getRequestBody().getContent().size() != 0) {
+        parameters = parameters + 1;
       }
     }
     return parameters;
@@ -413,8 +415,9 @@ public class SwaggerToProtoGenerator {
     for (Entry<String, ApiResponse> entry : operation.getResponses().entrySet()) {
       Schema schema = null;
       if (entry.getValue().getContent() != null &&
-          entry.getValue().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE) != null) {
-        schema = entry.getValue().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE).getSchema();
+          entry.getValue().getContent().size() != 0) {
+        schema = entry.getValue().getContent().get(
+            entry.getValue().getContent().keySet().iterator().next()).getSchema();
       }
       String type = convertSwaggerType(schema);
       boolean wrapped = !messages.contains(type);
diff --git a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/model/ProtoSchema.java b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/model/ProtoSchema.java
index c8d6ada61..169e742c9 100644
--- a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/model/ProtoSchema.java
+++ b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/model/ProtoSchema.java
@@ -34,6 +34,7 @@ import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import jakarta.ws.rs.core.MediaType;
 
 @RequestMapping(path = "/")
 public class ProtoSchema implements ProtoSchemaIntf {
@@ -177,4 +178,9 @@ public class ProtoSchema implements ProtoSchemaIntf {
   public FieldNeedWrap fieldNeedWrap(@RequestBody FieldNeedWrap fieldNeedWrap) {
     return fieldNeedWrap;
   }
+
+  @PostMapping(path = "/testTextPlain", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_PLAIN)
+  public String testTextPlain(@RequestBody String fieldNeedWrap) {
+    return null;
+  }
 }
diff --git a/common/common-protobuf/src/test/resources/ProtoSchema.proto b/common/common-protobuf/src/test/resources/ProtoSchema.proto
index 0380d4fff..fcdeea027 100644
--- a/common/common-protobuf/src/test/resources/ProtoSchema.proto
+++ b/common/common-protobuf/src/test/resources/ProtoSchema.proto
@@ -65,13 +65,13 @@ message BaseRequestWrap {
 }
 
 //@WrapProperty
-message BaseResponseWrap444 {
-  Enum_2610aa5dc6cd086cf20168892802c9c765a557f4951557340ad9f0982c53e055 value = 1;
+message BaseResponseWrap200 {
+  int32 value = 1;
 }
 
 //@WrapProperty
-message BaseResponseWrap200 {
-  int32 value = 1;
+message BaseResponseWrap444 {
+  Enum_2610aa5dc6cd086cf20168892802c9c765a557f4951557340ad9f0982c53e055 value = 1;
 }
 
 //@WrapArguments
@@ -274,6 +274,16 @@ message MapUserResponseWrap200 {
   map<string, User> value = 1;
 }
 
+//@WrapArguments
+message TestTextPlainRequestWrap {
+  string fieldNeedWrap = 1;
+}
+
+//@WrapProperty
+message TestTextPlainResponseWrap200 {
+  string value = 1;
+}
+
 //@WrapArguments
 message UserWrapInProtobufRequestWrap {
   int32 ivalue = 1;
@@ -422,6 +432,9 @@ service MainService {
   //@Rpc{"argTypeName":"Ref1","responses":{"200":{"typeName":"Ref2"}}}
   rpc ref (Ref1) returns (Ref2);
 
+  //@Rpc{"argTypeName":"TestTextPlainRequestWrap","responses":{"200":{"typeName":"TestTextPlainResponseWrap200"}}}
+  rpc testTextPlain (TestTextPlainRequestWrap) returns (TestTextPlainResponseWrap200);
+
   //@Rpc{"argTypeName":"User","responses":{"200":{"typeName":"User"}}}
   rpc user (User) returns (User);
 
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
index cb1577447..4c58902eb 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
@@ -237,7 +237,8 @@ public class BodyProcessorCreator implements ParamValueProcessorCreator<RequestB
 
   @Override
   public ParamValueProcessor create(String parameterName, RequestBody parameter, Type genericParamType) {
-    Schema model = parameter.getContent().get(MediaType.APPLICATION_JSON).getSchema();
+    String mediaType = parameter.getContent().keySet().iterator().next();
+    Schema model = parameter.getContent().get(mediaType).getSchema();
     JavaType swaggerType = ConverterMgr.findJavaType(model.getType(), model.getFormat());
     boolean isString = swaggerType != null && swaggerType.getRawClass().equals(String.class);
 
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/RestServerCodecFilter.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/RestServerCodecFilter.java
index 0415fba17..392112ec6 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/RestServerCodecFilter.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/RestServerCodecFilter.java
@@ -116,7 +116,7 @@ public class RestServerCodecFilter implements ProviderFilter {
       return CompletableFuture.completedFuture(response);
     }
 
-    responseEx.setContentType(produceProcessor.getName() + "; charset=utf-8");
+    responseEx.setContentType(produceProcessor.getName());
     try (BufferOutputStream output = new BufferOutputStream(Unpooled.compositeBuffer())) {
       produceProcessor.encodeResponse(output, response.getResult());
 
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
index 45f67f70c..27d70d4e7 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
@@ -57,14 +57,14 @@ public class TestRestOperationMeta {
   static class RestOperationMetaSchema {
     @Path("/emptyProduces")
     @GET
-    @Produces("")
+    @Produces(value = MediaType.APPLICATION_JSON)
     public String emptyProduces() {
       return null;
     }
 
     @Path("/emptyProducesWithView")
     @GET
-    @Produces("")
+    @Produces(value = MediaType.APPLICATION_JSON)
     @JsonView(Object.class)
     public String emptyProducesWithView() {
       return null;
@@ -72,14 +72,14 @@ public class TestRestOperationMeta {
 
     @Path("/notSupport")
     @GET
-    @Produces("notSupport")
+    @Produces(value = MediaType.APPLICATION_JSON)
     public void notSupport() {
 
     }
 
     @Path("/notSupportWithView")
     @GET
-    @Produces("notSupport")
+    @Produces(value = MediaType.APPLICATION_JSON)
     @JsonView(Object.class)
     public void notSupportWithView() {
 
@@ -117,14 +117,14 @@ public class TestRestOperationMeta {
 
     @Path("/textCharJsonChar")
     @GET
-    @Produces({MediaType.APPLICATION_JSON + ";charset=UTF-8", MediaType.TEXT_PLAIN + ";charset=UTF-8"})
+    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
     public void textCharJsonChar() {
 
     }
 
     @Path("/textCharJsonCharWithView")
     @GET
-    @Produces({MediaType.APPLICATION_JSON + ";charset=UTF-8", MediaType.TEXT_PLAIN + ";charset=UTF-8"})
+    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
     @JsonView(Object.class)
     public void textCharJsonCharWithView() {
 
@@ -297,7 +297,6 @@ public class TestRestOperationMeta {
   public void testCreateProduceProcessorsNotSupported() {
     findOperation("notSupport");
 
-    // TODO: should produces text/plain for string
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultProcessor(),
         operationMeta.ensureFindProduceProcessor((String) null));
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultProcessor(),
@@ -306,14 +305,13 @@ public class TestRestOperationMeta {
         operationMeta.ensureFindProduceProcessor(ProduceProcessorManager.DEFAULT_TYPE));
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultJsonProcessor(),
         operationMeta.findProduceProcessor(MediaType.APPLICATION_JSON));
-//    Assertions.assertNull(operationMeta.findProduceProcessor(MediaType.TEXT_PLAIN));
+    Assertions.assertNotNull(operationMeta.findProduceProcessor(MediaType.TEXT_PLAIN));
   }
 
   @Test
   public void testCreateProduceProcessorsNotSupportedWithView() {
     findOperation("notSupportWithView");
 
-    // TODO: should produces text/plain for string
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultProcessorByViewClass(Object.class),
         operationMeta.ensureFindProduceProcessor((String) null));
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultProcessorByViewClass(Object.class),
@@ -322,37 +320,35 @@ public class TestRestOperationMeta {
         operationMeta.ensureFindProduceProcessor(ProduceProcessorManager.DEFAULT_TYPE));
     Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultProcessorByViewClass(Object.class),
         operationMeta.findProduceProcessor(MediaType.APPLICATION_JSON));
-//    Assertions.assertNull(operationMeta.findProduceProcessor(MediaType.TEXT_PLAIN));
+    Assertions.assertNotNull(operationMeta.findProduceProcessor(MediaType.TEXT_PLAIN));
   }
 
   @Test
   public void testCreateProduceProcessorsTextAndWildcard() {
     findOperation("textPlain");
 
-    // TODO: should produces text/plain for string
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
-//        operationMeta.ensureFindProduceProcessor(MediaType.WILDCARD));
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
-//        operationMeta.ensureFindProduceProcessor(MediaType.TEXT_PLAIN));
-//    Assertions.assertNull(operationMeta.ensureFindProduceProcessor(MediaType.APPLICATION_JSON));
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
-//        operationMeta.ensureFindProduceProcessor(
-//            MediaType.APPLICATION_JSON + "," + MediaType.APPLICATION_XML + "," + MediaType.WILDCARD));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
+        operationMeta.ensureFindProduceProcessor(MediaType.WILDCARD));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
+        operationMeta.ensureFindProduceProcessor(MediaType.TEXT_PLAIN));
+    Assertions.assertNull(operationMeta.ensureFindProduceProcessor(MediaType.APPLICATION_JSON));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findDefaultPlainProcessor(),
+        operationMeta.ensureFindProduceProcessor(
+            MediaType.APPLICATION_JSON + "," + MediaType.APPLICATION_XML + "," + MediaType.WILDCARD));
   }
 
   @Test
   public void testCreateProduceProcessorsTextAndWildcardWithView() {
     findOperation("textPlainWithView");
 
-    // TODO: should produces text/plain for string
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
-//        operationMeta.ensureFindProduceProcessor(MediaType.WILDCARD));
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
-//        operationMeta.ensureFindProduceProcessor(MediaType.TEXT_PLAIN));
-//    Assertions.assertNull(operationMeta.ensureFindProduceProcessor(MediaType.APPLICATION_JSON));
-//    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
-//        operationMeta.ensureFindProduceProcessor(
-//            MediaType.APPLICATION_JSON + "," + MediaType.APPLICATION_XML + "," + MediaType.WILDCARD));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
+        operationMeta.ensureFindProduceProcessor(MediaType.WILDCARD));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
+        operationMeta.ensureFindProduceProcessor(MediaType.TEXT_PLAIN));
+    Assertions.assertNull(operationMeta.ensureFindProduceProcessor(MediaType.APPLICATION_JSON));
+    Assertions.assertSame(ProduceProcessorManager.INSTANCE.findPlainProcessorByViewClass(Object.class),
+        operationMeta.ensureFindProduceProcessor(
+            MediaType.APPLICATION_JSON + "," + MediaType.APPLICATION_XML + "," + MediaType.WILDCARD));
   }
 
   @Test
diff --git a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/EdgeServiceGovernanceTest.java b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/EdgeServiceGovernanceTest.java
index 9c9d3eaaa..cfb07abe3 100644
--- a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/EdgeServiceGovernanceTest.java
+++ b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/EdgeServiceGovernanceTest.java
@@ -69,7 +69,7 @@ public class EdgeServiceGovernanceTest implements CategorizedTestCase {
           public void run() {
             try {
               String result = template.getForObject(url + "?name={1}", String.class, "hello");
-              if (!"\"hello\"".equals(result)) {
+              if (!"hello".equals(result)) {
                 notExpectedFailed.set(true);
               }
             } catch (Exception e) {
@@ -108,7 +108,7 @@ public class EdgeServiceGovernanceTest implements CategorizedTestCase {
           public void run() {
             try {
               String result = template.getForObject(url + "?name={1}", String.class, "hello");
-              if (!"\"hello\"".equals(result)) {
+              if (!"hello".equals(result)) {
                 notExpectedFailed.set(true);
               }
             } catch (Exception e) {
diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFileUploadSchema.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFileUploadSchema.java
index 4713923c3..cfa900c45 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFileUploadSchema.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFileUploadSchema.java
@@ -52,16 +52,15 @@ public class TestFileUploadSchema implements CategorizedTestCase {
 
   private void testFileUpload(RestTemplate template, String cseUrlPrefix, File file1, String file1Content)
       throws IOException {
+    String result1 = template.postForObject(cseUrlPrefix + "/upload1", new HttpEntity<>(new HashMap<>()), String.class);
+    TestMgr.check("null file", result1);
+
     Map<String, Object> map = new HashMap<>();
     map.put("file1", new FileSystemResource(file1));
     String file2Content = "Hello EveryOne";
     File file2 = File.createTempFile("测试2", ".txt");
     FileUtils.writeStringToFile(file2, file2Content, StandardCharsets.UTF_8, false);
     map.put("file2", new FileSystemResource(file2));
-
-    String result1 = template.postForObject(cseUrlPrefix + "/upload1", new HttpEntity<>(new HashMap<>()), String.class);
-    TestMgr.check("null file", result1);
-
     String expect = String.format("%s:%s:%s\n" + "%s:%s:%s",
         file1.getName(),
         MediaType.TEXT_PLAIN,
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
index e1d0cea3f..b733ea029 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
@@ -30,7 +30,6 @@ import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.demo.compute.Person;
 import org.apache.servicecomb.demo.ignore.InputModelForTestIgnore;
 import org.apache.servicecomb.demo.ignore.OutputModelForTestIgnore;
-import org.apache.servicecomb.demo.jaxbbean.JAXBPerson;
 import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.foundation.common.part.FilePart;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
@@ -97,14 +96,6 @@ public class CodeFirstJaxrs {
     return body;
   }
 
-  @Path("/appXml")
-  @POST
-  @Consumes(MediaType.APPLICATION_JSON)
-  @Produces(MediaType.APPLICATION_XML)
-  public JAXBPerson appXml(JAXBPerson body) {
-    return body;
-  }
-
   @Path("/bytes")
   @POST
   public byte[] bytes(byte[] input) {
diff --git a/demo/demo-schema/src/main/resources/microservices/jaxrs/compute.yaml b/demo/demo-schema/src/main/resources/microservices/jaxrs/compute.yaml
index 6652895b3..32c4bf14e 100644
--- a/demo/demo-schema/src/main/resources/microservices/jaxrs/compute.yaml
+++ b/demo/demo-schema/src/main/resources/microservices/jaxrs/compute.yaml
@@ -59,7 +59,7 @@ paths:
         "200":
           description: response of 200
           content:
-            application/json:
+            text/plain:
               schema:
                 type: string
   /istrue:
@@ -79,14 +79,12 @@ paths:
       - name: a
         in: query
         required: false
-        explode: false
         schema:
           type: integer
           format: int32
       - name: b
         in: query
         required: false
-        explode: false
         schema:
           type: integer
           format: int32
@@ -117,6 +115,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/Person'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/Person'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/Person'
         x-name: user
       responses:
         "200":
@@ -162,6 +166,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/Person'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/Person'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/Person'
         x-name: user
       responses:
         "200":
@@ -178,6 +188,12 @@ paths:
           application/json:
             schema:
               type: string
+          application/protobuf:
+            schema:
+              type: string
+          text/plain:
+            schema:
+              type: string
         x-name: jsonInput
       responses:
         "200":
diff --git a/demo/demo-springmvc/springmvc-server/src/main/resources/schemas/CodeFirstSpringmvcForSchema.yaml b/demo/demo-springmvc/springmvc-server/src/main/resources/schemas/CodeFirstSpringmvcForSchema.yaml
index baf09a674..9ac86e2f7 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/resources/schemas/CodeFirstSpringmvcForSchema.yaml
+++ b/demo/demo-springmvc/springmvc-server/src/main/resources/schemas/CodeFirstSpringmvcForSchema.yaml
@@ -41,6 +41,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 file:
                   type: string
@@ -52,5 +53,10 @@ paths:
             application/json:
               schema:
                 type: boolean
-components:
-  schemas: {}
+            application/protobuf:
+              schema:
+                type: boolean
+            text/plain:
+              schema:
+                type: boolean
+components: {}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
index 6522335f8..bf9aa56b8 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Type;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -332,6 +333,7 @@ public final class SwaggerUtils {
     return (cls != String.class
         && cls != Date.class
         && cls != LocalDate.class
+        && cls != LocalDateTime.class
         && cls != byte[].class
         && cls != File.class
         && !cls.getName().equals("org.springframework.web.multipart.MultipartFile")
diff --git a/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml b/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
index ff2cb70cf..8b9b4b188 100644
--- a/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
+++ b/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
@@ -31,6 +31,12 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/PageString'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/PageString'
+          text/plain:
+            schema:
+              $ref: '#/components/schemas/PageString'
         x-name: page
       responses:
         "200":
@@ -39,6 +45,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/PageString'
+            application/protobuf:
+              schema:
+                $ref: '#/components/schemas/PageString'
+            text/plain:
+              schema:
+                $ref: '#/components/schemas/PageString'
 components:
   schemas:
     PageString:
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
index 910306990..0b412afd9 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
@@ -55,7 +55,7 @@ public class RequestAttributeAnnotationProcessor extends
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, RequestAttribute annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    parameterGenerator.setHttpParameterType(HttpParameterType.FORM);
     if (StringUtils.isNotEmpty(getParameterName(annotation))) {
       parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/MethodMixupAnnotations.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/MethodMixupAnnotations.java
index 7df4c5748..2513b4e91 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/MethodMixupAnnotations.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/MethodMixupAnnotations.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.swagger.generator.springmvc;
 
+import java.time.LocalDateTime;
+
 import org.apache.servicecomb.foundation.test.scaffolding.model.User;
 import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.springframework.http.MediaType;
@@ -46,7 +48,6 @@ import jakarta.servlet.http.Part;
 import jakarta.validation.constraints.Max;
 import jakarta.validation.constraints.Min;
 
-// TODO: Now not support consumes User as text/plain. This test case should fail.
 @SuppressWarnings("unused")
 @RequestMapping(path = "MethodMixupAnnotations")
 public class MethodMixupAnnotations {
@@ -165,4 +166,9 @@ public class MethodMixupAnnotations {
       @Min(value = 20) @Max(value = 30) @RequestParam(name = "d", required = false) int d) {
     return "Hello " + a + b + c + d + e;
   }
+
+  @GetMapping(path = "/testLocalDateTime")
+  public LocalDateTime testLocalDateTime(@RequestParam("date") LocalDateTime date) {
+    return date;
+  }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
index 1644797b0..121f96127 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/mixupAnnotations.yaml
@@ -266,6 +266,32 @@ paths:
             text/plain:
               schema:
                 type: string
+  /testLocalDateTime:
+    get:
+      operationId: testLocalDateTime
+      parameters:
+      - name: date
+        in: query
+        required: true
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "200":
+          description: response of 200
+          content:
+            application/json:
+              schema:
+                type: string
+                format: date-time
+            application/protobuf:
+              schema:
+                type: string
+                format: date-time
+            text/plain:
+              schema:
+                type: string
+                format: date-time
   /uploadFileAndAttribute:
     post:
       operationId: uploadFileAndAttribute
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
index 8f0a1be61..aa9e75796 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
@@ -23,7 +23,6 @@ import java.util.Map.Entry;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.converter.ConverterMgr;
-import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.apache.servicecomb.swagger.invocation.context.HttpStatus;
 import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
 import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
@@ -81,16 +80,15 @@ public class ResponsesMeta {
     }
 
     for (Entry<String, ApiResponse> entry : operation.getResponses().entrySet()) {
-      if (entry.getValue().getContent() == null) {
-        continue;
-      }
-      if (entry.getValue().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE) == null) {
+      if (entry.getValue().getContent() == null || entry.getValue().getContent().size() == 0) {
         continue;
       }
 
+      String mediaType = entry.getValue().getContent().keySet().iterator().next();
+
       JavaType javaType = ConverterMgr.findJavaType(swagger,
           SwaggerUtils.getSchema(swagger,
-              entry.getValue().getContent().get(SwaggerConst.DEFAULT_MEDIA_TYPE).getSchema()));
+              entry.getValue().getContent().get(mediaType).getSchema()));
 
       if ("default".equals(entry.getKey())) {
         defaultResponse = javaType;
@@ -130,10 +128,6 @@ public class ResponsesMeta {
     }
   }
 
-  public Map<Integer, JavaType> getResponseMap() {
-    return responseMap;
-  }
-
   public JavaType findResponseType(int statusCode) {
     JavaType responseType = responseMap.get(statusCode);
     if (responseType == null) {
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
index f0e1bf483..972ce6d7e 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
@@ -33,7 +33,7 @@ import io.swagger.v3.oas.models.Operation;
 public class TestResponsesMeta {
   static class ResponseMetaImpl {
     @ApiResponses({@ApiResponse(responseCode = "400", description = "",
-        content = {@Content(schema = @Schema(type = "string"))}),
+        content = {@Content(schema = @Schema(implementation = String.class))}),
         @ApiResponse(responseCode = "401", description = "",
             content = {@Content(schema = @Schema(implementation = String.class))},
             headers = {@Header(name = "h1", schema = @Schema(implementation = String.class))})
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
index 66733718b..af443db95 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
@@ -41,10 +41,12 @@ public class TestConsumerResponseMapperFactorys {
 
     CompletableFuture<String> async();
 
-    @ApiResponse(responseCode = "200", description = "", content = {@Content(schema = @Schema(type = "string"))})
+    @ApiResponse(responseCode = "200", description = "", content =
+        {@Content(schema = @Schema(implementation = String.class))})
     Response scbResponse();
 
-    @ApiResponse(responseCode = "200", description = "", content = {@Content(schema = @Schema(type = "string"))})
+    @ApiResponse(responseCode = "200", description = "", content =
+        {@Content(schema = @Schema(implementation = String.class))})
     jakarta.ws.rs.core.Response jaxrsResponse();
 
     Optional<String> optional();
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
index f7672dcfe..c576bae5d 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
@@ -45,13 +45,13 @@ public class TestProducerResponseMapperFactorys {
     }
 
     @ApiResponse(responseCode = "200", description = "",
-        content = {@Content(schema = @Schema(type = "string"))})
+        content = {@Content(schema = @Schema(implementation = String.class))})
     public Response scbResponse() {
       return Response.ok("scb");
     }
 
     @ApiResponse(responseCode = "200", description = "",
-        content = {@Content(schema = @Schema(type = "string"))})
+        content = {@Content(schema = @Schema(implementation = String.class))})
     public jakarta.ws.rs.core.Response jaxrsResponse() {
       return jakarta.ws.rs.core.Response.ok("jaxrs").build();
     }
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
index 9deb84bfc..44f4f3cf7 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
@@ -37,7 +37,8 @@ import jakarta.ws.rs.core.Response;
 public class TestJaxrsConsumerResponseMapper {
   @Path("/")
   interface ConsumerResponseForTest {
-    @ApiResponse(responseCode = "200", description = "", content = @Content(schema = @Schema(type = "string")))
+    @ApiResponse(responseCode = "200", description = "", content = @Content(schema =
+    @Schema(implementation = String.class)))
     @Path("/jaxrsResponse")
     @GET
     jakarta.ws.rs.core.Response jaxrsResponse();


[servicecomb-java-chassis] 07/12: [SCB-2803]fix problems in spring mvc test case

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 51e010cc01ca93e33a7e5642a7697e6a1cae15ca
Author: liubao <bi...@qq.com>
AuthorDate: Fri Aug 11 18:04:42 2023 +0800

    [SCB-2803]fix problems in spring mvc test case
---
 .../swagger/generator/ParameterGenerator.java      |  1 +
 .../generator/core/AbstractSwaggerGenerator.java   |  4 +--
 .../parameter/PartParameterTypeProcessor.java      |  6 ++--
 .../annotation/RequestPartAnnotationProcessor.java |  2 +-
 .../swagger/generator/springmvc/Echo.java          | 15 ++++----
 .../swagger/generator/springmvc/TestSpringmvc.java | 22 +++++-------
 .../RequestPartAnnotationProcessorTest.java        |  4 +++
 .../src/test/resources/schemas/DemoRest.yaml       |  3 +-
 .../test/resources/schemas/defaultParameter.yaml   |  3 +-
 .../src/test/resources/schemas/echo.yaml           | 40 ++++++++++++++++++++++
 10 files changed, 73 insertions(+), 27 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
index 656900e0c..326bec32d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ParameterGenerator.java
@@ -134,6 +134,7 @@ public class ParameterGenerator {
             + "by annotations rule.");
       }
       RequestBody requestBody = new RequestBody();
+      requestBody.setRequired(parameterGeneratorContext.getRequired());
       Map<String, Object> extensions = new HashMap<>();
       extensions.put(SwaggerConst.EXT_BODY_NAME, parameterGeneratorContext.getParameterName());
       if (parameterGeneratorContext.getRawJson() != null) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
index fe219b34a..17b491b52 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractSwaggerGenerator.java
@@ -235,8 +235,8 @@ public abstract class AbstractSwaggerGenerator implements SwaggerGenerator {
       try {
         operationGenerator.generate();
       } catch (Throwable e) {
-        String msg = String.format("generate swagger operation failed, method=%s:%s.",
-            this.cls.getName(), method.getName());
+        String msg = String.format("Generate swagger operation failed, method=%s:%s, cause=%s",
+            this.cls.getSimpleName(), method.getName(), e.getMessage());
         throw new IllegalStateException(msg, e);
       }
 
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
index d8dd33b1b..d35db0df9 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/PartParameterTypeProcessor.java
@@ -46,10 +46,12 @@ public class PartParameterTypeProcessor implements ParameterTypeProcessor {
       throw new IllegalArgumentException("Part type must declare consumes " + MediaType.MULTIPART_FORM_DATA);
     }
     if (parameterGenerator.getHttpParameterType() != HttpParameterType.FORM) {
-      throw new IllegalArgumentException("Part type must declare as form parameter.");
+      throw new IllegalArgumentException(
+          getProcessType().getRawClass().getSimpleName() + " type must declare as form parameter.");
     }
     if (StringUtils.isEmpty(parameterGenerator.getParameterGeneratorContext().getParameterName())) {
-      throw new IllegalArgumentException("Name is required for Part parameter.");
+      throw new IllegalArgumentException(
+          "Name is required for parameter " + getProcessType().getRawClass().getSimpleName());
     }
     parameterGenerator.getParameterGeneratorContext().updateConsumes(List.of(MediaType.MULTIPART_FORM_DATA));
 
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
index b78f374e1..433320103 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
@@ -48,7 +48,7 @@ public class RequestPartAnnotationProcessor extends
   @Override
   public void process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       ParameterGenerator parameterGenerator, RequestPart annotation) {
-    parameterGenerator.setHttpParameterType(HttpParameterType.COOKIE);
+    parameterGenerator.setHttpParameterType(HttpParameterType.FORM);
     if (StringUtils.isNotEmpty(getParameterName(annotation))) {
       parameterGenerator.getParameterGeneratorContext().setParameterName(getParameterName(annotation));
     }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/Echo.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/Echo.java
index 9210255d6..92d6d450b 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/Echo.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/Echo.java
@@ -31,11 +31,13 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
+import jakarta.ws.rs.core.MediaType;
+
 @RequestMapping(
     path = "Echo",
     method = {RequestMethod.PUT},
-    consumes = {"a", "b"},
-    produces = {"a", "b"})
+    consumes = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN},
+    produces = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
 public class Echo {
 
   @RequestMapping("emptyPath")
@@ -73,18 +75,19 @@ public class Echo {
     return null;
   }
 
-  @RequestMapping("part")
-  public void part(MultipartFile part) {
+  @RequestMapping(value = "part", consumes = MediaType.MULTIPART_FORM_DATA)
+  public void part(@RequestPart MultipartFile part) {
 
   }
 
+  // TODO: this should fail. RequestMapping not parse consumes and produces.
   @RequestMapping("partArray")
-  public void partArray(MultipartFile[] part) {
+  public void partArray(@RequestPart MultipartFile[] part) {
 
   }
 
   @RequestMapping("partList")
-  public void partList(List<MultipartFile> part) {
+  public void partList(@RequestPart List<MultipartFile> part) {
 
   }
 
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
index 5dcd0b79f..db100a79c 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
@@ -55,8 +55,8 @@ public class TestSpringmvc {
   @Test
   public void testClassMethodNoPath() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.ClassMethodNoPath:noPath.",
-        "Path must not both be empty in class and method",
+        "Generate swagger operation failed, method=ClassMethodNoPath:noPath, "
+            + "cause=Path must not both be empty in class and method",
         ClassMethodNoPath.class,
         "noPath");
   }
@@ -78,8 +78,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingRequestMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingRequestMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingRequestMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingRequestMapping");
   }
@@ -87,8 +86,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingGetMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingGetMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingGetMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingGetMapping");
   }
@@ -96,8 +94,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingPutMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingPutMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingPutMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingPutMapping");
   }
@@ -105,8 +102,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingPostMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingPostMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingPostMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingPostMapping");
   }
@@ -114,8 +110,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingPatchMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingPatchMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingPatchMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingPatchMapping");
   }
@@ -123,8 +118,7 @@ public class TestSpringmvc {
   @Test
   public void testMethodMultiPathUsingDeleteMapping() {
     UnitTestSwaggerUtils.testException(
-        "generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.springmvc.MethodMultiPath:usingDeleteMapping.",
-        "not allowed multi path.",
+        "Generate swagger operation failed, method=MethodMultiPath:usingDeleteMapping, cause=not allowed multi path.",
         MethodMultiPath.class,
         "usingDeleteMapping");
   }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessorTest.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessorTest.java
index d73671158..a17f85d15 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessorTest.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessorTest.java
@@ -21,6 +21,8 @@ import java.util.List;
 
 import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
 import org.junit.jupiter.api.Test;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -30,7 +32,9 @@ public class RequestPartAnnotationProcessorTest {
     UnitTestSwaggerUtils.testSwagger("schemas/DemoRest.yaml", DemoRest.class);
   }
 
+  @RequestMapping("/")
   public static class DemoRest {
+    @RequestMapping(method = RequestMethod.POST, path = "/fun")
     public void fun(@RequestPart("stringParam") String stringParam,
         @RequestPart(name = "intParam") int intParam,
         @RequestPart("stringParamArray") String[] stringParamArray,
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
index f23bef699..c7a325a94 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/DemoRest.yaml
@@ -21,7 +21,7 @@ info:
   title: swagger definition for org.apache.servicecomb.swagger.generator.springmvc.processor.annotation.RequestPartAnnotationProcessorTest$DemoRest
   version: 1.0.0
 servers:
-- url: /DemoRest
+- url: /
 paths:
   /fun:
     post:
@@ -30,6 +30,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 stringParam:
                   type: string
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
index 9ebc918de..ba3af4ca1 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/defaultParameter.yaml
@@ -95,4 +95,5 @@ paths:
       responses:
         "200":
           description: response of 200
-components: {}
\ No newline at end of file
+components:
+  schemas: {}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
index ed90eae0f..c82aa04f9 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/echo.yaml
@@ -66,6 +66,20 @@ paths:
               - RED
               - YELLOW
               - BLUE
+          application/protobuf:
+            schema:
+              type: string
+              enum:
+              - RED
+              - YELLOW
+              - BLUE
+          text/plain:
+            schema:
+              type: string
+              enum:
+              - RED
+              - YELLOW
+              - BLUE
         required: true
         x-name: color
       responses:
@@ -95,6 +109,20 @@ paths:
                 type: array
                 items:
                   type: string
+          application/protobuf:
+            schema:
+              type: array
+              items:
+                type: array
+                items:
+                  type: string
+          text/plain:
+            schema:
+              type: array
+              items:
+                type: array
+                items:
+                  type: string
         required: true
         x-name: param
       responses:
@@ -115,6 +143,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: string
@@ -129,6 +158,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: string
@@ -143,6 +173,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: array
@@ -159,6 +190,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: array
@@ -175,6 +207,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: array
@@ -191,6 +224,7 @@ paths:
         content:
           multipart/form-data:
             schema:
+              type: object
               properties:
                 part:
                   type: array
@@ -208,6 +242,12 @@ paths:
           application/json:
             schema:
               type: string
+          application/protobuf:
+            schema:
+              type: string
+          text/plain:
+            schema:
+              type: string
         required: true
         x-raw-json: true
         x-name: jsonInput


[servicecomb-java-chassis] 09/12: [SCB-2803]fix problems in demo pojo test case

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit b5d46255329232b3b5d81ac11947b31b8919c87c
Author: liubao <bi...@qq.com>
AuthorDate: Mon Aug 14 19:28:56 2023 +0800

    [SCB-2803]fix problems in demo pojo test case
---
 .../provider/pojo/definition/PojoConsumerMeta.java |  8 ---
 .../swagger/generator/OperationGenerator.java      |  2 -
 .../generator/core/AbstractOperationGenerator.java | 10 ----
 .../generator/pojo/PojoOperationGenerator.java     |  7 ++-
 .../swagger/generator/core/TestPojo.java}          | 55 ++++++++-------------
 .../resources/schemas/ParameterAnnotation.yaml     | 57 ++++++++++++++++++++++
 .../src/test/resources/schemas/Schema.yaml         |  2 +-
 .../producer/ProducerArgumentsMapperCreator.java   |  2 +-
 8 files changed, 86 insertions(+), 57 deletions(-)

diff --git a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
index 1b1451d29..336f0d46d 100644
--- a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
+++ b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
@@ -28,8 +28,6 @@ import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.provider.consumer.MicroserviceReferenceConfig;
 import org.apache.servicecomb.swagger.engine.SwaggerConsumer;
 import org.apache.servicecomb.swagger.engine.SwaggerConsumerOperation;
-import org.apache.servicecomb.swagger.generator.OperationGenerator;
-import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 
 import jakarta.ws.rs.core.Response.Status;
@@ -46,16 +44,10 @@ public class PojoConsumerMeta {
     this.microserviceReferenceConfig = microserviceReferenceConfig;
     this.schemaMeta = schemaMeta;
 
-    SwaggerGenerator intfSwaggerGenerator = SwaggerGenerator.create(swaggerConsumer.getConsumerIntf());
-    intfSwaggerGenerator.scanClassAnnotation();
     for (SwaggerConsumerOperation swaggerConsumerOperation : swaggerConsumer.getOperations().values()) {
       String operationId = swaggerConsumerOperation.getSwaggerOperation().getOperationId();
       // SwaggerConsumer has make sure can find operationMeta
       OperationMeta operationMeta = schemaMeta.ensureFindOperation(operationId);
-
-      OperationGenerator intfOperationGenerator = intfSwaggerGenerator
-          .createOperationGenerator(swaggerConsumerOperation.getConsumerMethod());
-      intfOperationGenerator.generateResponse();
       PojoConsumerOperationMeta pojoConsumerOperationMeta = new PojoConsumerOperationMeta(this, operationMeta,
           swaggerConsumerOperation);
 
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
index 1d5bec48c..c7aff4c80 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
@@ -35,8 +35,6 @@ public interface OperationGenerator {
 
   void setPath(String value);
 
-  void generateResponse();
-
   OperationGeneratorContext getOperationGeneratorContext();
 
   /**
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index 4d89a1d38..dbbc9ec14 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -64,7 +64,6 @@ import io.swagger.v3.oas.models.PathItem;
 import io.swagger.v3.oas.models.Paths;
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.Schema;
-import io.swagger.v3.oas.models.parameters.RequestBody;
 import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
 import jakarta.servlet.http.HttpServletResponse;
@@ -87,8 +86,6 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
 
   protected Operation swaggerOperation;
 
-  protected RequestBody bodyParameter;
-
   protected OperationGeneratorContext operationGeneratorContext;
 
   public AbstractOperationGenerator(AbstractSwaggerGenerator swaggerGenerator, Method method) {
@@ -144,13 +141,6 @@ public abstract class AbstractOperationGenerator implements OperationGenerator {
     this.path = path;
   }
 
-  @Override
-  public void generateResponse() {
-    scanMethodAnnotation();
-    scanResponse();
-    correctOperation();
-  }
-
   public void generate() {
     scanMethodAnnotation();
     scanMethodParameters();
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
index c36f56cc6..ffc7e540a 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/PojoOperationGenerator.java
@@ -82,12 +82,17 @@ public class PojoOperationGenerator extends AbstractOperationGenerator {
   }
 
   private void wrapParametersToBody(List<ParameterGenerator> bodyFields) {
+    // process annotations like parameter name
+    for (ParameterGenerator parameterGenerator : bodyFields) {
+      scanMethodParameter(parameterGenerator);
+    }
+
     String simpleRef = MethodUtils.findSwaggerMethodName(method) + "Body";
 
     Schema<?> bodyModel = new ObjectSchema();
     for (ParameterGenerator parameterGenerator : bodyFields) {
       bodyModel.addProperty(parameterGenerator.getParameterGeneratorContext().getParameterName(),
-          SwaggerUtils.resolveTypeSchemas(swagger, parameterGenerator.getGenericType()));
+          parameterGenerator.getParameterGeneratorContext().getSchema());
     }
 
     swagger.getComponents().addSchemas(simpleRef, bodyModel);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestPojo.java
similarity index 52%
copy from swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestPojo.java
index 1d5bec48c..d733d0250 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestPojo.java
@@ -14,38 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.swagger.generator;
-
-
-import org.apache.servicecomb.swagger.generator.core.OperationGeneratorContext;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.Operation;
-
-public interface OperationGenerator {
-  OpenAPI getSwagger();
-
-  Operation getOperation();
-
-  void setHttpMethod(String httpMethod);
-
-  String getHttpMethod();
-
-  void addOperationToSwagger();
-
-  void setPath(String value);
-
-  void generateResponse();
-
-  OperationGeneratorContext getOperationGeneratorContext();
-
-  /**
-   * Used to check if one of operation has form parameter
-   */
-  boolean isForm();
-
-  /**
-   * Used to check if one of operation form parameter is binary
-   */
-  boolean isBinary();
+package org.apache.servicecomb.swagger.generator.core;
+
+import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
+import org.junit.jupiter.api.Test;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+
+public class TestPojo {
+  @SuppressWarnings("unused")
+  public static class ParameterAnnotation {
+    @Operation(summary = "differentName", operationId = "differentName")
+    public int operationIdAndParameter(@Parameter(name = "x") int a, @Parameter(name = "y") int b) {
+      return a * 2 + b;
+    }
+  }
+
+  @Test
+  public void testResponseEntity() {
+    UnitTestSwaggerUtils.testSwagger("schemas/ParameterAnnotation.yaml", ParameterAnnotation.class);
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml
new file mode 100644
index 000000000..5c2ffe0ee
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/ParameterAnnotation.yaml
@@ -0,0 +1,57 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+---
+openapi: 3.0.1
+info:
+  title: swagger definition for org.apache.servicecomb.swagger.generator.core.TestPojo$ParameterAnnotation
+  version: 1.0.0
+servers:
+- url: /ParameterAnnotation
+paths:
+  /differentName:
+    post:
+      summary: differentName
+      operationId: differentName
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/differentNameBody'
+          application/protobuf:
+            schema:
+              $ref: '#/components/schemas/differentNameBody'
+        x-name: differentNameBody
+      responses:
+        "200":
+          description: response of 200
+          content:
+            application/json:
+              schema:
+                type: integer
+                format: int32
+components:
+  schemas:
+    differentNameBody:
+      type: object
+      properties:
+        x:
+          type: integer
+          format: int32
+        "y":
+          type: integer
+          format: int32
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
index 133803a55..44d2ad5bf 100644
--- a/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
+++ b/swagger/swagger-generator/generator-core/src/test/resources/schemas/Schema.yaml
@@ -870,6 +870,6 @@ components:
     wrapToBodyWithDescBody:
       type: object
       properties:
-        value:
+        desc:
           type: integer
           format: int32
\ No newline at end of file
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
index 1932162a5..a58662ca0 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
@@ -70,7 +70,7 @@ public class ProducerArgumentsMapperCreator extends AbstractArgumentsMapperCreat
       String parameterName) {
     throw new IllegalStateException(String
         .format("failed to find producer parameter in contract, method=%s:%s, parameter name=%s.",
-            providerMethod.getDeclaringClass().getName(), providerMethod.getName(), parameterName));
+            providerMethod.getDeclaringClass().getSimpleName(), providerMethod.getName(), parameterName));
   }
 
   @Override