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 d3a787ccdfd2d3e966be697910ff8200620afeba
Author: liubao <[email protected]>
AuthorDate: Mon Aug 21 21:07:09 2023 +0800

    [SCB-2803]add test case for request proto-buffer codec
---
 .../servicecomb/common/rest/codec/RestCodec.java   |  2 +-
 .../rest/codec/param/BodyProcessorCreator.java     | 21 +++++++++---------
 .../demo/springmvc/client/TestContentType.java     | 25 ++++++++++++++++++++--
 .../springmvc/server/ContentTypeSpringmvc.java     | 13 +++++++++++
 4 files changed, 48 insertions(+), 13 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
index 3427a6065..161288b8f 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
@@ -60,7 +60,7 @@ public final class RestCodec {
                 param.getParamName(),
                 param.getParamProcessor().getProcessorType(),
                 e.getMessage());
-        throw new InvocationException(Status.BAD_REQUEST, message);
+        throw new InvocationException(Status.BAD_REQUEST, message, e);
       }
     }
 
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 dd177a31c..736b8a060 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
@@ -79,6 +79,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
   private static final Object LOCK = new Object();
 
   public static class BodyProcessor implements ParamValueProcessor {
+    // Producer target type. For consumer, is null.
     protected JavaType targetType;
 
     protected Class<?> serialViewClass;
@@ -95,11 +96,12 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
 
     protected RequestBody requestBody;
 
-    public BodyProcessor(OperationMeta operationMeta, JavaType targetType, 
RequestBody parameter) {
-      if (!StringUtils.isEmpty((String) parameter.getExtensions()
+    public BodyProcessor(OperationMeta operationMeta, JavaType targetType, 
RequestBody requestBody) {
+      this.requestBody = requestBody;
+      if (!StringUtils.isEmpty((String) this.requestBody.getExtensions()
           .get(SwaggerConst.EXT_JSON_VIEW))) {
         try {
-          this.serialViewClass = Class.forName((String) 
parameter.getExtensions()
+          this.serialViewClass = Class.forName((String) 
this.requestBody.getExtensions()
               .get(SwaggerConst.EXT_JSON_VIEW));
         } catch (Throwable e) {
           //ignore
@@ -107,11 +109,10 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
         }
       }
 
-      this.requestBody = new RequestBody();
       this.targetType = targetType;
-      this.isRequired = parameter.getRequired() != null && 
parameter.getRequired();
-      if (parameter.getContent() != null) {
-        supportedContentTypes.addAll(parameter.getContent().keySet());
+      this.isRequired = this.requestBody.getRequired() != null && 
this.requestBody.getRequired();
+      if (this.requestBody.getContent() != null) {
+        supportedContentTypes.addAll(this.requestBody.getContent().keySet());
       }
 
       if (operationMeta != null) {
@@ -179,7 +180,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
       }
 
       if (SwaggerConst.PROTOBUF_TYPE.equals(contentType)) {
-        String messageName = (String) 
requestBody.getContent().get(SwaggerConst.PROTOBUF_TYPE).getExtensions()
+        String messageName = (String) requestBody.getExtensions()
             .get(SwaggerConst.EXT_BODY_NAME);
         ProtoMapper protoMapper = scopedProtobufSchemaManager
             .getOrCreateProtoMapper(openAPI, operationMeta.getSchemaId(),
@@ -240,7 +241,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
      */
     private Buffer createBodyBuffer(String contentType, Object arg) throws 
IOException {
       if (SwaggerConst.PROTOBUF_TYPE.equals(contentType)) {
-        String messageName = (String) 
requestBody.getContent().get(SwaggerConst.PROTOBUF_TYPE).getExtensions()
+        String messageName = (String) requestBody.getExtensions()
             .get(SwaggerConst.EXT_BODY_NAME);
         ProtoMapper protoMapper = scopedProtobufSchemaManager
             .getOrCreateProtoMapper(openAPI, operationMeta.getSchemaId(),
@@ -248,7 +249,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator<RequestB
                 
requestBody.getContent().get(SwaggerConst.PROTOBUF_TYPE).getSchema());
         RootSerializer serializer = protoMapper.getSerializerSchemaManager()
             
.createRootSerializer(protoMapper.getProto().getMessage(messageName),
-                targetType);
+                Object.class);
         Map<String, Object> bodyArg = new HashMap<>(1);
         bodyArg.put("value", arg);
         return new BufferImpl().appendBytes(serializer.serialize(bodyArg));
diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestContentType.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestContentType.java
index aaf564673..662f153b0 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestContentType.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestContentType.java
@@ -17,16 +17,18 @@
 
 package org.apache.servicecomb.demo.springmvc.client;
 
-import jakarta.ws.rs.core.MediaType;
-
 import org.apache.servicecomb.demo.TestMgr;
+import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.provider.springmvc.reference.CseHttpEntity;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.client.RestTemplate;
 
+import jakarta.ws.rs.core.MediaType;
+
 public class TestContentType {
 
   private RestTemplate restTemplate = RestTemplateBuilder.create();
@@ -35,6 +37,7 @@ public class TestContentType {
     testGlobalSetting();
     testApiOperation();
     testRequestMapping();
+    testProtoBuffer();
     testResponseTypeOverwrite();
   }
 
@@ -79,6 +82,24 @@ public class TestContentType {
     TestMgr.check(MediaType.APPLICATION_JSON, 
extractContentType(responseEntity.getHeaders().getContentType()));
   }
 
+
+  private void testProtoBuffer() {
+    HttpHeaders requestHeaders = new HttpHeaders();
+    requestHeaders.add(HttpHeaders.CONTENT_TYPE, SwaggerConst.PROTOBUF_TYPE);
+    User user = new User();
+    user.setIndex(100);
+    user.setName("hello");
+    user.setNames(new String[] {"a1", "a2"});
+    CseHttpEntity<User> requestEntity = new CseHttpEntity<>(user, 
requestHeaders);
+    ResponseEntity<String> responseEntity = restTemplate
+        .exchange("cse://springmvc/contentTypeSpringmvc/testProtoBuffer", 
HttpMethod.POST,
+            requestEntity, String.class);
+    TestMgr.check(
+        "testRequestMapping: name=[hello:100:[a1, a2]], request 
content-type=[application/protobuf]",
+        responseEntity.getBody());
+    TestMgr.check(MediaType.APPLICATION_JSON, 
extractContentType(responseEntity.getHeaders().getContentType()));
+  }
+
   private void testResponseTypeOverwrite() {
     ResponseEntity<String> responseEntity = restTemplate
         
.getForEntity("cse://springmvc/contentTypeSpringmvcOverwrite/testResponseTypeOverwrite",
 String.class);
diff --git 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ContentTypeSpringmvc.java
 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ContentTypeSpringmvc.java
index a31232752..6626f553c 100644
--- 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ContentTypeSpringmvc.java
+++ 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ContentTypeSpringmvc.java
@@ -17,7 +17,11 @@
 
 package org.apache.servicecomb.demo.springmvc.server;
 
+import java.util.Arrays;
+
+import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.swagger.generator.SwaggerConst;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -43,4 +47,13 @@ public class ContentTypeSpringmvc {
   public String testRequestMapping(@RequestBody String name, 
HttpServletRequest request) {
     return String.format("testRequestMapping: name=[%s], request 
content-type=[%s]", name, request.getContentType());
   }
+
+  // TODO: 注册中心不会覆盖契约
+  @RequestMapping(path = "/testProtoBuffer", method = RequestMethod.POST,
+      consumes = SwaggerConst.PROTOBUF_TYPE, produces = 
MediaType.APPLICATION_JSON)
+  public String testProtoBuffer(@RequestBody User user, HttpServletRequest 
request) {
+    return String.format("testRequestMapping: name=[%s], request 
content-type=[%s]",
+        user.getName() + ":" + user.getIndex() + ":" +
+            Arrays.toString(user.getNames()), request.getContentType());
+  }
 }

Reply via email to