参考:E9BackendDdevelopmentGuide.pdf (e-cloudstore.com)
根据文档指引在E9安装目录下可找到如下两个文件夹
com.engine目录是核心业务逻辑类所在目录,不允许直接暴露对外服务接口,对外服务接口请暴露在com.api下(专门提供API服务的目录)。
在com.api.模块.web目录下建立对外接口类,然后通过extends(继承)的方式暴露RESTful服务接口。
秉着学习研究的态度,我想知道接口在调用时,engine到底是如何起作用的。
场景:后端流程引擎/路径管理/路径设置中,点击操作菜单
通过前端调试可以发现,点击操作菜单弹出的界面是由API返回的JSON构成的。
API的地址:http://xxxxxx/api/workflow/OperationMenuSet/getCurrentNodeMenuSetData
后台执行过程记录如下:
1、定位api具体资源路径,即/api/workflow/web目录中的文件WorkflowOperationMenuAction
发现了javax.ws.rs.Path以及@Path注解。
package com.api.workflow.web;
import com.engine.workflow.web.workflowPath.OperationMenuAction;
import javax.ws.rs.Path;
@Path("/workflow/OperationMenuSet")
public class WorkflowOperationMenuAction extends OperationMenuAction {
public WorkflowOperationMenuAction() {
}
}
2、定位到继承类,/engine/workflow/web/workflowPath目录中的OperationMenuAction
在这里发现了getCurrentNodeMenuSetData方法,依旧使用了@Path
在此方法中可以看到使用了operationMenuService
private void setService(User var1) {
this.operationMenuService = (OperationMenuServiceImpl)ServiceUtil.getService(OperationMenuServiceImpl.class, var1);
}
@GET
@Path("/getCurrentNodeMenuSetData")
@Produces({"text/plain;charset=utf-8"})
public String getCurrentNodeMenuSetData(@Context HttpServletRequest var1, @Context HttpServletResponse var2) {
Object var3 = new HashMap();
try {
User var4 = CommonUtil.getUserByRequest(var1, var2);
this.setService(var4);
var3 = this.operationMenuService.getCurrentNodeMenuSetData(ParamUtil.request2Map(var1));
} catch (Exception var5) {
var5.printStackTrace();
((Map)var3).put("api_status", false);
((Map)var3).put("api_errormsg", "catch exception : " + var5.getMessage());
}
return JSONObject.toJSONString(var3);
}
3、继续定位到service的实现类,/engine/workflow/service/impl/workflowPath/operationMenuServiceImpl
此处通过调用 GetOperationMenuInfoCmd实现
public class OperationMenuServiceImpl extends Service implements OperationMenuService {
public OperationMenuServiceImpl() {
}
public Map<String, Object> getCurrentNodeMenuSetData(Map<String, Object> var1) {
return (Map)this.commandExecutor.execute(new GetOperationMenuInfoCmd(var1, this.user));
}
//......
}
4、最终定位到cmd找到具体的业务逻辑,/engine/workflow/cmd/workflowPath/node/operationMenu/GetOperationMenuInfoCmd
总结,API路径是假,通过service找cmd才是真。