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