直接上代码,ScenarioServiceContext。
public class ScenarioServiceContext {
private ScenarioServiceContext(){}
private Map<String,Object> pathVarMap = new HashMap<>();
private Map<String,Object> headerMap = new HashMap<>();
private Object requestBody;
private Map<String,String[]> queryParams;
public Object getPathVarMap(String name){return this.pathVarMap.get(name);}
public Object getHeaderMap(String name){return this.headerMap .get(name);}
public Object getAllHeaders(){return this.headerMap;}
public Object getRequestBody(){return this.requestBody;}
public Map<String,String[]> getQueryParams(){return this.queryParams;}
public String[] getQueryParam(String key){
if(this.queryParams == null){
return null;
}
return this.queryParams.get(key);
}
public static class Builder{
private ScenarioServiceContext scenarioServiceContext = new ScenarioServiceContext ();
public Builder header(String name,Object value){
this.scenarioServiceContext.headerMap.put(name,value);
return this;
}
public Builder pathVariable(String name,Object value){
this.scenarioServiceContext.pathVarMap.put(name,value);
return this;
}
public Builder requestBody(String name,Object value){
this.scenarioServiceContext.requestBody=requestBody;
return this;
}
public Builder queryParams(Map<String,String[]> queryParams){
if(queryParams != null){
this.scenarioServiceContext.queryParams = queryParams;
}
return this;
}
public ScenarioServiceContext build(){return this.scenarioServiceContext;}
}
}
一个产品是由很多零件构成的,该类通过静态内部类等方式实现各零件无序构造。一般我们针对一个请求,如果请求成功的话都会有一个返回结果,那么现在如何将ScenarioServiceContext跟ScenarioServiceResult<T>联系起来呢,这中间要有一个映射方法,返回类型为ScenarioServiceResult<T>,参数是接口IScenarioService<T>,上下文中api domin,requestBody,queryParams。
上代码,ScenarioServiceInvoke。
public class ScenarioServiceInvoke(){
public static <T> ScenarioServiceResult<T> invoke(IScenarioService<T> service,String domin,String action,Map<String,Object> requestBody,Map<String,String[]> queryParams){
ScenarioSeviceContext serviceContext = new ScenarioSeviceContext.Builder()
.pathVarible("domin",domin).pathVarible("action",action)
.requestBody(requestBody)
.queryParams(queryParams).build();
return service.execute(serviceContext);
}
}
这里我提到了api路径,举例:http://xxx.xxx.com:8080/上下文路径/xxx/xxx,在我的《mybatis一对多业务逻辑实现》这篇文章中
@Component("scenario.query.service"),这个注释,会在spring ioc中生成一个bean,该路径构成api路径的一部分,即:http://xxx.xxx.com:8080/上下文路径/scenario/query。
可以看到这个映射方法建造好上下文中api 路径,请求体,请求参数。返回的是请求之后的结果ScenarioServiceResult。该映射方法主要在Controller层使用,下一篇《WebFluxController层实现》来讲怎么使用。