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 2020/08/03 00:43:08 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2047]when ruturn null for primitive type of highway will throw NPE

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


The following commit(s) were added to refs/heads/master by this push:
     new 6d6ead6  [SCB-2047]when ruturn null for primitive type of highway will throw NPE
6d6ead6 is described below

commit 6d6ead6179f678e81287cbb7f537b0bbb017cbbc
Author: liubao <bi...@qq.com>
AuthorDate: Fri Jul 31 16:04:45 2020 +0800

    [SCB-2047]when ruturn null for primitive type of highway will throw NPE
---
 .../jaxrs/client/TestSchemeInterfaceJaxrs.java     |  1 +
 .../demo/jaxrs/server/SchemeInterfaceJaxrs.java    |  2 +-
 .../jaxrs/server/SchemeInterfaceJaxrsImpl.java     |  4 +--
 .../transport/highway/HighwayCodec.java            | 29 ++++++++++++++--------
 4 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestSchemeInterfaceJaxrs.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestSchemeInterfaceJaxrs.java
index 6ba8d17..869f200 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestSchemeInterfaceJaxrs.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestSchemeInterfaceJaxrs.java
@@ -47,6 +47,7 @@ public class TestSchemeInterfaceJaxrs implements CategorizedTestCase {
 
   public void testAllTransport() throws Exception {
     TestMgr.check(3, jaxrs.add(1, 2));
+    TestMgr.check(0, jaxrs.add(-1, 1));
 
     try {
       jaxrs.reduce(1, 3);
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrs.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrs.java
index bd9f07c..8546d2c 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrs.java
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrs.java
@@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 public interface SchemeInterfaceJaxrs {
   @Path("/add")
   @GET
-  public int add(@Min(1) @RequestParam("a") int a, @Min(1) @RequestParam("b") int b);
+  int add(@Min(-100) @RequestParam("a") int a, @Min(1) @RequestParam("b") int b);
 
   @Path("/interfaceModel")
   @GET
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java
index cafaed9..6800bab 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java
@@ -17,15 +17,13 @@
 
 package org.apache.servicecomb.demo.jaxrs.server;
 
-import javax.validation.constraints.Min;
-
 import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.springframework.data.domain.Page;
 
 @RestSchema(schemaId = "SchemeInterfaceJaxrs", schemaInterface = SchemeInterfaceJaxrs.class)
 public class SchemeInterfaceJaxrsImpl implements SchemeInterfaceJaxrs {
   @Override
-  public int add(@Min(1) int a, @Min(1) int b) {
+  public int add(int a, int b) {
     return a + b;
   }
 
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java
index ea8fd0b..a87ec0b 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java
@@ -26,14 +26,13 @@ import org.apache.servicecomb.codec.protobuf.definition.RequestRootDeserializer;
 import org.apache.servicecomb.codec.protobuf.definition.ResponseRootDeserializer;
 import org.apache.servicecomb.codec.protobuf.definition.ResponseRootSerializer;
 import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.vertx.client.tcp.TcpData;
 import org.apache.servicecomb.foundation.vertx.tcp.TcpOutputStream;
-import org.apache.servicecomb.swagger.engine.SwaggerProducerOperation;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.transport.highway.message.RequestHeader;
 import org.apache.servicecomb.transport.highway.message.ResponseHeader;
 
+import com.fasterxml.jackson.databind.JavaType;
 import com.google.common.base.Defaults;
 
 import io.swagger.models.parameters.Parameter;
@@ -59,7 +58,6 @@ public final class HighwayCodec {
     return os;
   }
 
-  @SuppressWarnings({"rawtypes", "unchecked"})
   private static Map<String, Object> addPrimitiveTypeDefaultValues(Invocation invocation,
       Map<String, Object> swaggerArguments) {
     // proto buffer never serialize default values, put it back in provider
@@ -70,18 +68,13 @@ public final class HighwayCodec {
         if (swaggerArguments.get(parameter.getName()) == null) {
           Type type = invocation.getOperationMeta().getSwaggerProducerOperation()
               .getSwaggerParameterType(parameter.getName());
-          if (type instanceof Class) {
-            if (((Class) type).isPrimitive()) {
-              swaggerArguments.put(parameter.getName(), Defaults.defaultValue((Class) type));
-            }
-          }
+          swaggerArguments.put(parameter.getName(), defaultPrimitiveValue(null, type));
         }
       }
     }
     return swaggerArguments;
   }
 
-  @SuppressWarnings({"rawtypes", "unchecked"})
   public static void decodeRequest(Invocation invocation, RequestHeader header, OperationProtobuf operationProtobuf,
       Buffer bodyBuffer) throws Exception {
     RequestRootDeserializer<Object> requestDeserializer = operationProtobuf.getRequestRootDeserializer();
@@ -112,12 +105,26 @@ public final class HighwayCodec {
 
     ResponseRootDeserializer<Object> bodySchema = operationProtobuf
         .findResponseRootDeserializer(header.getStatusCode());
+    JavaType type = invocation.findResponseType(header.getStatusCode());
     Object body = bodySchema
-        .deserialize(tcpData.getBodyBuffer().getBytes(), invocation.findResponseType(header.getStatusCode()));
+        .deserialize(tcpData.getBodyBuffer().getBytes(), type);
 
-    Response response = Response.create(header.getStatusCode(), header.getReasonPhrase(), body);
+    Response response = Response.create(header.getStatusCode(), header.getReasonPhrase()
+        , defaultPrimitiveValue(body, type));
     response.setHeaders(header.getHeaders());
 
     return response;
   }
+
+  private static Object defaultPrimitiveValue(Object body, Type type) {
+    if (body == null) {
+      if (type instanceof Class<?> && ((Class<?>) type).isPrimitive()) {
+        return Defaults.defaultValue((Class<?>) type);
+      }
+      if (type instanceof JavaType && ((JavaType) type).isPrimitive()) {
+        return Defaults.defaultValue(((JavaType) type).getRawClass());
+      }
+    }
+    return body;
+  }
 }