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:35 UTC

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

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