工厂模式获取上下文,创建Controller层请求的映射参数

直接上代码,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层实现》来讲怎么使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值