diff --git a/core/src/main/java/com/qq/tars/client/rpc/tars/TarsClientFilterChain.java b/core/src/main/java/com/qq/tars/client/rpc/tars/TarsClientFilterChain.java index 4b594a6d..63cff682 100644 --- a/core/src/main/java/com/qq/tars/client/rpc/tars/TarsClientFilterChain.java +++ b/core/src/main/java/com/qq/tars/client/rpc/tars/TarsClientFilterChain.java @@ -47,6 +47,7 @@ protected void doRealInvoke(Request request, Response response) throws Throwable BeanAccessor.setBeanValue(tarsServantResponse, "result", result.getResult()); BeanAccessor.setBeanValue(tarsServantResponse, "ret", result.getRet()); BeanAccessor.setBeanValue(tarsServantResponse, "remark", result.getRemark()); + BeanAccessor.setBeanValue(tarsServantResponse, "context", result.getContext()); } catch (Exception e) { BeanAccessor.setBeanValue(tarsServantResponse, "cause", e); throw e; diff --git a/core/src/main/java/com/qq/tars/rpc/protocol/tars/TarsCodec.java b/core/src/main/java/com/qq/tars/rpc/protocol/tars/TarsCodec.java index ddf8dbc6..2a329620 100644 --- a/core/src/main/java/com/qq/tars/rpc/protocol/tars/TarsCodec.java +++ b/core/src/main/java/com/qq/tars/rpc/protocol/tars/TarsCodec.java @@ -589,15 +589,20 @@ public void decodeResponseBody(ServantResponse resp) throws ProtocolException { response.setResult(results[i++]); } + response.setContext((HashMap) is.read(TarsHelper.STAMP_MAP, 9, false)); List list = methodInfo.getParametersList(); for (TarsMethodParameterInfo info : list) { - if (!TarsHelper.isHolder(info.getAnnotations())) { - continue; - } - try { - TarsHelper.setHolderValue(request.getMethodParameters()[info.getOrder() - 1], results[i++]); - } catch (Exception e) { - throw new ProtocolException(e); + if (TarsHelper.isHolder(info.getAnnotations())) { + try { + TarsHelper.setHolderValue(request.getMethodParameters()[info.getOrder() - 1], results[i++]); + } catch (Exception e) { + throw new ProtocolException(e); + } + } else if (TarsHelper.isContext(info.getAnnotations()) && response.getContext() != null) { + Map context = (HashMap) request.getMethodParameters()[info.getOrder() - 1]; + if (context != null) { + context.putAll(response.getContext()); + } } } response.setStatus((HashMap) is.read(TarsHelper.STAMP_MAP, 7, false));