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

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

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