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.