使用前提:
接口不存在(即报404)时候使用stub假数据.
入口:
BusinessExceptionHandlerAdvice中
NoHandlerFoundException
异常捕获方法中.
流程图
配置文件是在哪里读取的?
在oa/web/controller/handler/EnvironmentInit.java 中,
EnvironmentInit 实现了ApplicationListener,
所以在tomcat应用启动成功后就会执行,
在onApplicationEvent 方法中读取配置文件,
配置文件路径:
"/config/stubMap.json"
EnvironmentInit源码:
package oa.web.controller.handler;
import com.file.hw.props.GenericReadPropsUtil;
import com.io.hw.json.HWJacksonUtils;
import com.string.widget.util.RegexUtil;
import com.string.widget.util.ValueWidget;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext;
import java.util.Map;
/**
* Created by 黄威 on 3月/22/18.<br >
* 读取配置文件的核心类,是获取properties参数的唯一入口<br >
* 执行顺序<br>
* 注解Resource的setter方法<br>
* 实现接口ServletContextAware的setServletContext 方法<br>
* onApplicationEvent方法<br />
* config/stubMap.json 的格式:<br />
* <code>
* {
* "/a/b/c": "a_b_c",
* "/house/recommended/listfilter/json": "recommendedList",
* "ccc": "ddd",
* "ccc": "ddd",
* "test": "test"
* }
* </code> <br />
* key 是接口路径,建议以斜杠开头,<br />
* value 是redis 的key<br />
* 如何设置stub response 内容?:<br />
* 通过接口 :http://127.0.0.1:8080/redis/setCache,传递参数:id,key,value<br />
* 配置文件路径:<br />
* /src/main/resources/config/stubMap.json
*/
@Configuration
public class EnvironmentInit implements ApplicationListener<ContextRefreshedEvent>, ServletContextAware {
private ServletContext servletContext;
private Map<String, String> stubPathMap;
// @Resource
// private RequestSafeThreadParamDto requestSafeThreadParamDto;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if (!ValueWidget.isNullOrEmpty(getStubPathMap())) {
return;
}
ClassLoader classLoader = this.servletContext.getClassLoader();
String resourcePath = "/config/stubMap.json";
String json = GenericReadPropsUtil.getConfigTxt(classLoader, resourcePath);
if (null != json) {
json = RegexUtil.sedDeleteComment(json);//删除第一行的注释
setStubPathMap(HWJacksonUtils.deSerializeMap(json, String.class));
}
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public Map<String, String> getStubPathMap() {
return stubPathMap;
}
public void setStubPathMap(Map<String, String> stubPathMap) {
this.stubPathMap = stubPathMap;
}
}
stub假数据存储在哪里
存储在redis 中,
那么如何通过接口路径获取redis key呢?
通过如下方法:
String redisKey = servletActionMap.get(path);
if (null == redisKey && path.startsWith("/")) {//比如如果找不着"/agent/list/json",则去查找"agent/list/json"
redisKey = servletActionMap.get(path.substring(1, path.length()));
}
if (null == redisKey) {//比如如果找不着"agent/list/json",则找"agent_list_json"
redisKey = path.replace("/", "_");
if (redisKey.startsWith("_")) {
redisKey.substring(1, redisKey.length());
}
}
说明:上述代码中的path参数,是
request.getServletPath()
比如接口 路径是"/agent/list/json",
那么拿"/agent/list/json"作为map的key,从映射的map 中查找,
若查找不到,则把
"agent_list_json"
作为redis key
映射的map从哪里获取?
从两个地方获取:
1.本地配置文件(优先级低):
"/config/stubMap.json"
内容如下(示例):
/*** 将被oa/web/controller/handler/EnvironmentInit.java 调用**/
{
"/a/b/c": "a_b_c",
"house/recommended/listfilter/json": "recommendedList",
"ccc": "ddd",
"ccc": "ddd",
"test": "test"
}
2,从redis中获取,优先级高,所以会覆盖本地文件配置
注意:
1.redis中的map比"/config/stubMap.json" 优先级高;
2,如果判断从redis获取的stub数据为空,则仍然继续走正常流程.
参考: https://my.oschina.net/huangweiindex/blog/1632499