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