对接easyopen

This commit is contained in:
tanghc
2019-03-10 21:55:53 +08:00
parent 3bfc5f7cc8
commit 99d90d60cc
33 changed files with 710 additions and 165 deletions

View File

@@ -2,21 +2,19 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gitee.sop</groupId>
<artifactId>sop-gateway-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sop-gateway-common</name>
<description>sop-gateway-common</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-boot.version>2.1.2.RELEASE</spring-boot.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
@@ -28,28 +26,44 @@
<commons-io.version>2.5</commons-io.version>
<commons-fileupload.version>1.3.3</commons-fileupload.version>
<commons-collection.version>3.2.2</commons-collection.version>
<xstream.version>1.4.7</xstream.version>
<velocity.version>1.7</velocity.version>
<hibernate-validator.version>6.0.10.Final</hibernate-validator.version>
<oltu.version>0.31</oltu.version>
<jwt.version>3.2.0</jwt.version>
<guava.version>18.0</guava.version>
<spring-data-redis.version>1.8.8.RELEASE</spring-data-redis.version>
<netty.version>4.1.25.Final</netty.version>
<jboss-marshalling-serial.version>2.0.5.Final</jboss-marshalling-serial.version>
<itextpdf.version>5.5.12</itextpdf.version>
<xmlworker.version>5.5.8</xmlworker.version>
<itext-asian.version>5.2.0</itext-asian.version>
<asm.version>6.2</asm.version>
<commons-lang3.version>3.8.1</commons-lang3.version>
<commons-codec.version>1.11</commons-codec.version>
<xstream.version>1.4.7</xstream.version>
<zookeeper.version>3.4.12</zookeeper.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 加了这个就不需要加版本号了 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
@@ -60,10 +74,6 @@
<artifactId>spring-boot-starter-webflux</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- zookeeper -->
<dependency>
@@ -84,7 +94,7 @@
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
@@ -93,11 +103,17 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
@@ -109,15 +125,11 @@
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
@@ -151,42 +163,60 @@
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
<version>2.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- 打包时跳过测试 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<!-- JDK8必须使用下面的配置 -->
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>

View File

@@ -95,6 +95,11 @@ public class ApiConfig {
*/
private boolean ignoreValidate;
/**
* 是否对结果进行合并
*/
private boolean mergeResult = true;
/**
* 超时时间
*/

View File

@@ -21,4 +21,9 @@ public class BaseRouteDefinition {
* 路由执行的顺序
*/
private int order = 0;
/**
* 是否忽略验证,业务参数验证除外
*/
private boolean ignoreValidate;
}

View File

@@ -32,7 +32,7 @@ public class SopConstants {
public static final int BIZ_ERROR_STATUS = 4000;
/**
* zookeeper存放接口信息的根目录
* zookeeper存放接口路由信息的根目录
*/
public static final String SOP_SERVICE_API_PATH = "/sop-service-api";
public static final String SOP_SERVICE_ROUTE_PATH = "/sop-service-route";
}

View File

@@ -0,0 +1,27 @@
package com.gitee.sop.gatewaycommon.easyopen;
import com.alibaba.fastjson.JSON;
import com.gitee.sop.gatewaycommon.message.Error;
import com.gitee.sop.gatewaycommon.result.ApiResult;
import com.gitee.sop.gatewaycommon.result.ResultExecutor;
import com.gitee.sop.gatewaycommon.zuul.result.ZuulResultExecutor;
import com.netflix.zuul.context.RequestContext;
/**
* @author tanghc
*/
public class EasyopenResultExecutor implements ResultExecutor<RequestContext, String> {
@Override
public String mergeResult(RequestContext request, String serviceResult) {
return serviceResult;
}
@Override
public String buildErrorResult(RequestContext request, Throwable ex) {
ApiResult apiResult = new ApiResult();
Error error = ZuulResultExecutor.getError(ex);
apiResult.setCode(error.getSub_code());
apiResult.setMsg(error.getSub_msg());
return JSON.toJSONString(apiResult);
}
}

View File

@@ -0,0 +1,34 @@
package com.gitee.sop.gatewaycommon.easyopen;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.validate.AbstractSigner;
import com.gitee.sop.gatewaycommon.validate.taobao.TaobaoSigner;
import org.apache.commons.codec.digest.DigestUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* @author tanghc
*/
public class EasyopenSigner extends AbstractSigner {
@Override
protected String buildServerSign(ApiParam params, String secret) {
Set<String> keySet = params.keySet();
List<String> paramNames = new ArrayList<String>(keySet);
Collections.sort(paramNames);
StringBuilder paramNameValue = new StringBuilder();
for (String paramName : paramNames) {
paramNameValue.append(paramName).append(params.get(paramName));
}
String source = secret + paramNameValue.toString() + secret;
return DigestUtils.md5Hex(source).toUpperCase();
}
}

View File

@@ -0,0 +1,26 @@
package com.gitee.sop.gatewaycommon.easyopen;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.gateway.configuration.BaseGatewayConfiguration;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import com.gitee.sop.gatewaycommon.validate.taobao.TaobaoSigner;
import com.gitee.sop.gatewaycommon.zuul.configuration.BaseZuulConfiguration;
/**
* @author tanghc
*/
public class EasyopenZuulConfiguration extends BaseZuulConfiguration {
static {
ParamNames.APP_KEY_NAME = "app_key";
ParamNames.API_NAME = "name";
ParamNames.SIGN_TYPE_NAME = "sign_type";
ParamNames.APP_AUTH_TOKEN_NAME = "access_token";
ApiConfig apiConfig = ApiContext.getApiConfig();
apiConfig.setSigner(new EasyopenSigner());
apiConfig.setZuulResultExecutor(new EasyopenResultExecutor());
apiConfig.setMergeResult(false);
}
}

View File

@@ -2,6 +2,7 @@ package com.gitee.sop.gatewaycommon.gateway.param;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.param.ApiParamFactory;
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
import org.springframework.web.server.ServerWebExchange;
@@ -14,11 +15,7 @@ public class GatewayParamBuilder implements ParamBuilder<ServerWebExchange> {
@Override
public ApiParam build(ServerWebExchange exchange) {
Map<String, String> params = exchange.getAttribute(SopConstants.CACHE_REQUEST_BODY_FOR_MAP);
ApiParam apiParam = new ApiParam();
for (Map.Entry<String, String> entry : params.entrySet()) {
apiParam.put(entry.getKey(), entry.getValue());
}
return apiParam;
return ApiParamFactory.build(params);
}

View File

@@ -16,7 +16,7 @@ import org.springframework.util.StringUtils;
import java.util.List;
import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_API_PATH;
import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_ROUTE_PATH;
/**
@@ -30,7 +30,7 @@ import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_API_PATH
@Slf4j
public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E extends BaseRouteDefinition, T> implements RouteManager {
protected String sopServiceApiPath = SOP_SERVICE_API_PATH;
protected String sopServiceApiPath = SOP_SERVICE_ROUTE_PATH;
protected Environment environment;
@@ -93,10 +93,7 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
String nodeData = new String(childData.getData());
log.info("\t* 子节点路径:" + childData.getPath() + ",该节点的数据为:" + nodeData);
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
routeRepository.add(serviceRouteInfo, routeDefinition);
}
saveRouteDefinitionList(serviceRouteInfo);
}
// 添加事件监听器
childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@@ -110,10 +107,7 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
// 添加子节点时触发
log.info("子节点:{}添加,数据为:{}", event.getData().getPath(), nodeData);
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
routeRepository.add(serviceRouteInfo, routeDefinition);
}
saveRouteDefinitionList(serviceRouteInfo);
} else if (PathChildrenCacheEvent.Type.CHILD_UPDATED.equals(type)) {
String nodeData = new String(event.getData().getData());
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
@@ -122,20 +116,31 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
// 删除下面所有节点
routeRepository.deleteAll(serviceRouteInfo);
// 添加新节点
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
routeRepository.add(serviceRouteInfo, routeDefinition);
}
saveRouteDefinitionList(serviceRouteInfo);
} else if (PathChildrenCacheEvent.Type.CHILD_REMOVED.equals(type)) {
String nodeData = new String(event.getData().getData());
log.info("子节点:{}删除,数据为:{}", event.getData().getPath(), nodeData);
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
routeRepository.deleteAll(serviceRouteInfo);
deleteRouteDefinitionList(serviceRouteInfo);
}
}
}
});
}
protected void saveRouteDefinitionList(R serviceRouteInfo) {
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
RouteDefinitionItemContext.add(routeDefinitionItem);
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
routeRepository.add(serviceRouteInfo, routeDefinition);
}
}
protected void deleteRouteDefinitionList(R serviceRouteInfo) {
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
RouteDefinitionItemContext.delete(routeDefinitionItem);
}
routeRepository.deleteAll(serviceRouteInfo);
}
}

View File

@@ -0,0 +1,27 @@
package com.gitee.sop.gatewaycommon.manager;
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
import java.util.HashMap;
import java.util.Map;
/**
* @author tanghc
*/
public class RouteDefinitionItemContext {
// key:id
private static Map<String, BaseRouteDefinition> routeDefinitionMap = new HashMap<>(64);
public static void add(BaseRouteDefinition routeDefinition) {
routeDefinitionMap.put(routeDefinition.getId(), routeDefinition);
}
public static BaseRouteDefinition getRouteDefinition(String id) {
return routeDefinitionMap.get(id);
}
public static void delete(BaseRouteDefinition routeDefinition) {
routeDefinitionMap.remove(routeDefinition.getId());
}
}

View File

@@ -0,0 +1,25 @@
package com.gitee.sop.gatewaycommon.param;
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
import com.gitee.sop.gatewaycommon.manager.RouteDefinitionItemContext;
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
import java.util.Map;
/**
* @author tanghc
*/
public class ApiParamFactory {
public static ApiParam build(Map<String, ?> params) {
ApiParam apiParam = new ApiParam();
for (Map.Entry<String, ?> entry : params.entrySet()) {
apiParam.put(entry.getKey(), entry.getValue());
}
BaseRouteDefinition routeDefinition = RouteDefinitionItemContext.getRouteDefinition(apiParam.fetchNameVersion());
if (routeDefinition == null) {
throw ErrorEnum.ISV_INVALID_METHOD.getErrorMeta().getException();
}
apiParam.setIgnoreValidate(routeDefinition.isIgnoreValidate());
return apiParam;
}
}

View File

@@ -2,10 +2,14 @@ package com.gitee.sop.gatewaycommon.result;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.exception.ApiException;
import com.gitee.sop.gatewaycommon.message.Error;
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
import com.gitee.sop.gatewaycommon.message.ErrorMeta;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
@@ -45,6 +49,10 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
@Override
public String mergeResult(T request, String serviceResult) {
boolean isMergeResult = ApiContext.getApiConfig().isMergeResult();
if (!isMergeResult) {
return serviceResult;
}
serviceResult = wrapResult(serviceResult);
int responseStatus = this.getBizHeaderCode(request);
JSONObject jsonObjectService;
@@ -99,4 +107,5 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
ret.put(ParamNames.SIGN_NAME, sign);
return ret.toJSONString();
}
}

View File

@@ -37,7 +37,7 @@ public interface ResultExecutor<T, R> {
* 合并结果
* @param request
* @param serviceResult
* @return
* @return 返回最终输出结果
*/
String mergeResult(T request, String serviceResult);
@@ -45,7 +45,7 @@ public interface ResultExecutor<T, R> {
* 合并错误结果
* @param request
* @param ex
* @return
* @return 返回最终输出结果
*/
R buildErrorResult(T request, Throwable ex);
}

View File

@@ -30,6 +30,9 @@ public class PostResultFilter extends BaseZuulFilter {
@Override
protected Object doRun(RequestContext requestContext) throws ZuulException {
if (requestContext.getResponse().isCommitted()) {
return null;
}
InputStream responseDataStream = requestContext.getResponseDataStream();
ApiConfig apiConfig = ApiContext.getApiConfig();
ResultExecutor<RequestContext, String> resultExecutor = apiConfig.getZuulResultExecutor();

View File

@@ -2,10 +2,13 @@ package com.gitee.sop.gatewaycommon.zuul.filter;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
import com.gitee.sop.gatewaycommon.exception.ApiException;
import com.gitee.sop.gatewaycommon.manager.RouteDefinitionItemContext;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.validate.Validator;
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
import com.gitee.sop.gatewaycommon.zuul.route.ZuulRouteDefinition;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;

View File

@@ -1,14 +1,17 @@
package com.gitee.sop.gatewaycommon.zuul.param;
import com.alibaba.fastjson.JSON;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.param.ApiParamFactory;
import com.gitee.sop.gatewaycommon.param.ApiUploadContext;
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
import com.gitee.sop.gatewaycommon.util.RequestUtil;
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.http.HttpServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@@ -24,6 +27,7 @@ import java.util.Set;
*
* @author tanghc
*/
@Slf4j
public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
private static final String CONTENT_TYPE_MULTIPART = MediaType.MULTIPART_FORM_DATA_VALUE;
@@ -33,16 +37,12 @@ public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
@Override
public ApiParam build(RequestContext ctx) {
try {
HttpServletRequest request = ctx.getRequest();
Map<String, Object> params = this.getJson(request);
return new ApiParam(params);
} catch (Exception e) {
throw ErrorEnum.ISV_INVALID_PARAMETER.getErrorMeta().getException();
}
HttpServletRequest request = ctx.getRequest();
Map<String, Object> params = this.getParams(request);
return ApiParamFactory.build(params);
}
public Map<String, Object> getJson(HttpServletRequest request) throws Exception {
public Map<String, Object> getParams(HttpServletRequest request) {
// zuul会做一层包装
if (request instanceof HttpServletRequestWrapper) {
HttpServletRequestWrapper req = (HttpServletRequestWrapper) request;
@@ -63,7 +63,12 @@ public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
// json或者纯文本形式
if (contectType.contains(CONTENT_TYPE_JSON) || contectType.contains(CONTENT_TYPE_TEXT)) {
String txt = RequestUtil.getText(request);
String txt = SopConstants.EMPTY_JSON;
try {
txt = RequestUtil.getText(request);
} catch (Exception e) {
log.error("获取纯文本内容失败", e);
}
params = JSON.parseObject(txt);
} else if (contectType.contains(CONTENT_TYPE_MULTIPART)) {
// 上传文件形式

View File

@@ -40,6 +40,12 @@ public class ZuulResultExecutor extends BaseExecutorAdapter<RequestContext, Stri
@Override
public String buildErrorResult(RequestContext request, Throwable throwable) {
Error error = getError(throwable);
JSONObject jsonObject = (JSONObject) JSON.toJSON(error);
return this.merge(request, jsonObject);
}
public static Error getError(Throwable throwable) {
Error error = null;
if (throwable instanceof ZuulException) {
ZuulException ex = (ZuulException) throwable;
@@ -52,8 +58,6 @@ public class ZuulResultExecutor extends BaseExecutorAdapter<RequestContext, Stri
if (error == null) {
error = ErrorEnum.AOP_UNKNOW_ERROR.getErrorMeta().getError();
}
JSONObject jsonObject = (JSONObject) JSON.toJSON(error);
return this.merge(request, jsonObject);
return error;
}
}