You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/03/15 13:04:05 UTC

[incubator-servicecomb-java-chassis] branch master updated: SCB-373 bugfix: if locateOperation error, invocation will be null, if response, will cause NullPointException

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 683ecdc  SCB-373 bugfix: if locateOperation error, invocation will be null, if response, will cause NullPointException
683ecdc is described below

commit 683ecdca777775985f28cb3b97ebc3a5796b9d7e
Author: jeho0815 <je...@email.com>
AuthorDate: Thu Mar 15 19:10:11 2018 +0800

    SCB-373 bugfix: if locateOperation error, invocation will be null, if response, will cause NullPointException
---
 .../common/rest/AbstractRestInvocation.java        |  5 +-
 .../apache/servicecomb/common/rest/RestConst.java  |  3 --
 .../rest/filter/inner/ServerRestArgsFilter.java    | 11 ++--
 .../common/rest/TestAbstractRestInvocation.java    | 60 ++++++++++++++++++++++
 .../vertx/http/AbstractHttpServletResponse.java    | 14 +++++
 .../vertx/http/HttpServletResponseEx.java          |  4 ++
 .../vertx/http/StandardHttpServletResponseEx.java  | 14 +++++
 7 files changed, 100 insertions(+), 11 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
index 6e6f876..3932f1b 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
@@ -73,7 +73,6 @@ public abstract class AbstractRestInvocation {
 
     OperationLocator locator = locateOperation(servicePathManager);
     requestEx.setAttribute(RestConst.PATH_PARAMETERS, locator.getPathVarMap());
-    requestEx.setAttribute(RestConst.OPERATION_PARAMETERS, locator.getOperation());
     this.restOperationMeta = locator.getOperation();
   }
 
@@ -214,8 +213,8 @@ public abstract class AbstractRestInvocation {
     }
     responseEx.setStatus(response.getStatusCode(), response.getReasonPhrase());
     responseEx.setContentType(produceProcessor.getName() + "; charset=utf-8");
-    invocation.getHandlerContext().put(RestConst.INVOCATION_HANDLER_RESPONSE, response);
-    invocation.getHandlerContext().put(RestConst.INVOCATION_HANDLER_PROCESSOR, produceProcessor);
+    responseEx.setAttribute(RestConst.INVOCATION_HANDLER_RESPONSE, response);
+    responseEx.setAttribute(RestConst.INVOCATION_HANDLER_PROCESSOR, produceProcessor);
 
     for (HttpServerFilter filter : httpServerFilters) {
       filter.beforeSendResponse(invocation, responseEx);
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
index aa23137..7e45aa8 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
@@ -34,9 +34,6 @@ public final class RestConst {
   // in HttpServletRequest attribute
   public static final String PATH_PARAMETERS = "servicecomb-paths";
 
-  //in HttpServletRequest attribute
-  public static final String OPERATION_PARAMETERS = "servicecomb-operations";
-
   // in HttpServletRequest attribute
   public static final String BODY_PARAMETER = "servicecomb-body";
 
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
index 830e33b..b690cbf 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
@@ -23,6 +23,7 @@ import org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
 import org.apache.servicecomb.common.rest.filter.HttpServerFilter;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
 import org.apache.servicecomb.foundation.vertx.stream.BufferOutputStream;
@@ -41,8 +42,8 @@ public class ServerRestArgsFilter implements HttpServerFilter {
 
   @Override
   public Response afterReceiveRequest(Invocation invocation, HttpServletRequestEx requestEx) {
-    RestOperationMeta restOperationMeta = (RestOperationMeta) requestEx
-        .getAttribute(RestConst.OPERATION_PARAMETERS);
+    OperationMeta operationMeta = invocation.getOperationMeta();
+    RestOperationMeta restOperationMeta = operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
     Object[] args = RestCodec.restToArgs(requestEx, restOperationMeta);
     invocation.setSwaggerArguments(args);
     return null;
@@ -50,9 +51,9 @@ public class ServerRestArgsFilter implements HttpServerFilter {
 
   @Override
   public void beforeSendResponse(Invocation invocation, HttpServletResponseEx responseEx) {
-    Response response = (Response) invocation.getHandlerContext().get(RestConst.INVOCATION_HANDLER_RESPONSE);
-    ProduceProcessor produceProcessor = (ProduceProcessor) invocation.getHandlerContext()
-        .get(RestConst.INVOCATION_HANDLER_PROCESSOR);
+    Response response = (Response) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_RESPONSE);
+    ProduceProcessor produceProcessor =
+        (ProduceProcessor) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_PROCESSOR);
     Object body = response.getResult();
     if (response.isFailed()) {
       body = ((InvocationException) body).getErrorData();
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
index 291c731..363bfab 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
@@ -449,6 +449,18 @@ public class TestAbstractRestInvocation {
 
     Map<String, Object> result = new HashMap<>();
     responseEx = new MockUp<HttpServletResponseEx>() {
+      private Map<String, Object> attributes = new HashMap<>();
+
+      @Mock
+      public void setAttribute(String key, Object value) {
+        this.attributes.put(key, value);
+      }
+
+      @Mock
+      public Object getAttribute(String key) {
+        return this.attributes.get(key);
+      }
+
       @Mock
       void setStatus(int sc, String sm) {
         result.put("statusCode", sc);
@@ -491,6 +503,18 @@ public class TestAbstractRestInvocation {
 
     Headers resultHeaders = new Headers();
     responseEx = new MockUp<HttpServletResponseEx>() {
+      private Map<String, Object> attributes = new HashMap<>();
+
+      @Mock
+      public void setAttribute(String key, Object value) {
+        this.attributes.put(key, value);
+      }
+
+      @Mock
+      public Object getAttribute(String key) {
+        return this.attributes.get(key);
+      }
+
       @Mock
       void addHeader(String name, String value) {
         resultHeaders.addHeader(name, value);
@@ -525,6 +549,18 @@ public class TestAbstractRestInvocation {
 
     Headers resultHeaders = new Headers();
     responseEx = new MockUp<HttpServletResponseEx>() {
+      private Map<String, Object> attributes = new HashMap<>();
+
+      @Mock
+      public void setAttribute(String key, Object value) {
+        this.attributes.put(key, value);
+      }
+
+      @Mock
+      public Object getAttribute(String key) {
+        return this.attributes.get(key);
+      }
+
       @Mock
       void addHeader(String name, String value) {
         resultHeaders.addHeader(name, value);
@@ -551,6 +587,18 @@ public class TestAbstractRestInvocation {
 
     Buffer buffer = Buffer.buffer();
     responseEx = new MockUp<HttpServletResponseEx>() {
+      private Map<String, Object> attributes = new HashMap<>();
+
+      @Mock
+      public void setAttribute(String key, Object value) {
+        this.attributes.put(key, value);
+      }
+
+      @Mock
+      public Object getAttribute(String key) {
+        return this.attributes.get(key);
+      }
+
       @Mock
       void setBodyBuffer(Buffer bodyBuffer) {
         buffer.appendBuffer(bodyBuffer);
@@ -582,6 +630,18 @@ public class TestAbstractRestInvocation {
 
     Buffer buffer = Buffer.buffer();
     responseEx = new MockUp<HttpServletResponseEx>() {
+      private Map<String, Object> attributes = new HashMap<>();
+
+      @Mock
+      public void setAttribute(String key, Object value) {
+        this.attributes.put(key, value);
+      }
+
+      @Mock
+      public Object getAttribute(String key) {
+        return this.attributes.get(key);
+      }
+
       @Mock
       void setBodyBuffer(Buffer bodyBuffer) {
         buffer.appendBuffer(bodyBuffer);
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/AbstractHttpServletResponse.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/AbstractHttpServletResponse.java
index 96e509a..a09e773 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/AbstractHttpServletResponse.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/AbstractHttpServletResponse.java
@@ -20,13 +20,17 @@ package org.apache.servicecomb.foundation.vertx.http;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
 import javax.ws.rs.core.Response.StatusType;
 
 public abstract class AbstractHttpServletResponse extends BodyBufferSupportImpl implements HttpServletResponseEx {
+  private Map<String, Object> attributes = new HashMap<>();
+
   @Override
   public String getCharacterEncoding() {
     throw new Error("not supported method");
@@ -216,4 +220,14 @@ public abstract class AbstractHttpServletResponse extends BodyBufferSupportImpl
   public StatusType getStatusType() {
     throw new Error("not supported method");
   }
+
+  @Override
+  public void setAttribute(String key, Object value) {
+    this.attributes.put(key, value);
+  }
+
+  @Override
+  public Object getAttribute(String key) {
+    return this.attributes.get(key);
+  }
 }
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/HttpServletResponseEx.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/HttpServletResponseEx.java
index 3b9abe9..9749f4b 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/HttpServletResponseEx.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/HttpServletResponseEx.java
@@ -22,4 +22,8 @@ import javax.ws.rs.core.Response.StatusType;
 
 public interface HttpServletResponseEx extends HttpServletResponse, BodyBufferSupport {
   StatusType getStatusType();
+
+  void setAttribute(String key, Object value);
+
+  Object getAttribute(String key);
 }
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
index 6bedab6..c2c1408 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
@@ -18,6 +18,8 @@
 package org.apache.servicecomb.foundation.vertx.http;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
@@ -30,6 +32,8 @@ import io.vertx.core.buffer.Buffer;
 public class StandardHttpServletResponseEx extends HttpServletResponseWrapper implements HttpServletResponseEx {
   private BodyBufferSupport bodyBuffer = new BodyBufferSupportImpl();
 
+  private Map<String, Object> attributes = new HashMap<>();
+
   private StatusType statusType;
 
   public StandardHttpServletResponseEx(HttpServletResponse response) {
@@ -81,4 +85,14 @@ public class StandardHttpServletResponseEx extends HttpServletResponseWrapper im
     }
     super.flushBuffer();
   }
+
+  @Override
+  public void setAttribute(String key, Object value) {
+    this.attributes.put(key, value);
+  }
+
+  @Override
+  public Object getAttribute(String key) {
+    return this.attributes.get(key);
+  }
 }

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.