一文读懂-苍穹的请求映射是怎样实现的原创
金蝶云社区-云社区用户n0uK7566
云社区用户n0uK7566
17人赞赏了该文章 1,829次浏览 未经作者许可,禁止转载编辑于2021年07月21日 14:52:33

苍穹的请求映射是怎样实现的

相信做过web开发的同学们,对web.xml都不会陌生,web.xml文件是用来配置:欢迎页、servlet请求路径、filter过滤器等,但是通常我们在平时苍穹开发过程中并不会注意到这个文件,那么它在什么位置呢?

Duang:

image.png

可以看到,默认在安装环境下的mservice-cosmic\webapp\WEB-INF目录下:

image.png

是不是很熟悉呢?

你以为这样就完了,等等:

image.png

整个配置文件只有一个servlet配置,纳尼?我们知道servlet用于配置映射请求路径,这里怎么只有一个路径呢,难道我们所有的请求都是通过/kapi/*请求来的吗?

其实不然,kapi是不是似曾相识,没错,这是开放平台的配置地址,苍穹通过这个地址暴露webapi服务供第三方调用,关于web单据api插件说明文档,请参考:

https://dev.kingdee.com/index/docsNew/772ebc7b-fe18-449c-b82a-109a60092554

 

那么问题来了,我们平时的请求是怎么前后端交互的呢,它的url是怎么映射的?

以打开首页为例,我们打开控制台观察到:大量的form/batchInvokeAction.do地址请求,是不是这个才是我们统一的请求入口呢

image.png

其实,苍穹url映射是配置在mservice-cosmic/conf目录下actionconfig.xml这个文件中:

image.png

这个好理解吧,package name对应第一层路径地址,class是对应的类,子级里面的method对应类的方法,这样通过请求路径映射到相应的方法,可以看到相当多的请求映射,我们以最常见的batchInvokeAction为例说明:

按配置打开kd.bos.web.actions.FormAction#batchInvokeAction,打个断点,刷新页面,请求正常接入触发断点

image.png

看到核心代码第442行调用微服务,根据请求参数,定位到如下:

image.png

自此,初步链路大致理通,那么还有一个问题,这么多的请求对应同一个地址, 处理又是怎么区分的呢,答案也很容易想到,根据调用的参数不同进行区分。

其实,我们注意到在bos-resource的jar包目录下,也有web.xml和actionconfig.xml文件

image.png

那么它和前面提到的两个文件有什么区别呢,优先级又是谁高呢?

对比文件内容发现,bos-resource里面的都是mservice-cosmic里面的增量扩展,我们猜测,为了提高文件的高复用性和灵活性,mservice-cosmic目录下的文件里面只抽取定义了一些公共的配置,在实际业务中,需求复杂多变,演变过程中将配置放在了bos-resources的jar包目录下进行维护,所以,bos-resource jar包目录下的优先级高于mservice-cosmic目录。

下面我们来验证一下我们的猜测:

第一步:我们将mservice-cosmic目录下的form修改为form2,重启服务

image.png

发现断点正常进来

image.png

我们索性直接删除这个文件,再重启:

image.png

还是得到同样的结果:

image.png

说明项目读取的并不是mservice-cosmic目录下的actioncofig.xml

跟同事交流,原先启动类里面有一个关于ActionConfigFile的配置,如下:

image.png

我们加上这个配置,再次修改一开始测试的mservice-cosmic\conf下的actionconfig.xml文件,请求得到结果如下:

image.png

正常生效,查看控制台:

image.png

原来,文章一开始提出的问题,请求url原来是通过kd.bos.actiondispatcher.ActionFilter过滤器进行转换映射的

跟一下代码,定位到如下加载actionconfig.xml的代码:

image.png

首先找actionConfigFiles.config这个配置:

image.png

没有这个配置的话,接着获取系统属性ActionConfigFile,找不到则默认加载bos-resource目录下的文件

image.png

image.png

 

那么,web.xml是不是也是这样的呢?

image.png

可以看到这里有web.xml路径的配置,但是看到外层的调用代码:

image.png

我们是无法配置到加载mservice-cosmic\webapp\WEB-INF下面的xml文件的,所以,web.xml以bos-resource包里面的为准,

image.png

好了,豁然开朗,大功告成。

总结:

1.      System.setProperty("ActionConfigFile", "../../../mservice-cosmic/conf/actionconfig.xml");该配置可配可不配,默认取bos-resource.jar目录下的文件,配置了则以配置的为准

2.      苍穹的请求路径映射是通过kd.bos.actiondispatcher.ActionFilter过滤器加载转换actionconfig.xml进行的

3.      mservice-cosmic路径下的web.xml文件没用,以bos-resource包下面的为准


赞 17