resteasy-links的研究(七)

这篇文章里,我们通过一个例子看一下ClassLinksProvider的使用方法。首先要创建一个样例项目,这个样例项目放在了这里:

在这个例子里,首先做一个数据class叫做Car

这个class里面的重点是它没有RESTServiceDiscovery的实例:

因此,如果要针对这个class动态创建一个RESTServiceDiscovery的实例,就要用到ClassLinksProvider的能力。

因此结合上篇文章所讲,我们把ClassLinksProvider应用在我们自己service的方法里:

可以看到这个service是使用ClassLinksProvidergetLinks()方法来从一个class动态获取RESTServiceDiscovery的实例数据。

因此我们应该可以在客户端请求Car这个class的RESTServiceDiscovery对应数据。为了达到这个目标,Car这个class要在resource class当中被扫描到,下面是相关代码:

从上面的截图可以看到这个Car的class在FooResource当中的car()方法里作为返回类型,然后这个car()方法被标记了@LinkResource,因此resteasy-links会扫描它。

上面说的这个逻辑,在之前的resteasy-links分析当中已经看到过了,下面是之前分析过的代码位置:

如上所示,ClassLinksProvider会根据方法的标记是@GET还是@POST而决定具体的link数据信息。然后这个processLinkResource()方法被getLinks()方法所使用:

然后从上面的截图可以看到这个方法使用了getLinkResources()方法,这个方法在AbstractLinksProvider方法里面:

可以看到实际扫描的逻辑就是看实际的resouce里面的方法有没有用@LinkResource来标记。为了验证这条逻辑线,我们可以把这个例子跑起来运行试试看,用下面的命令把样例服务运行起来:

$ mvn jetty:run

下面是服务启动状况:

服务启动后,执行下面的命令来访问服务:

$ http -v "http://localhost:8080/class?className=io.alchemystudio.resteasy.links.Car"

上面的命令会请求Car这个class所包含的links信息。请求查询结果如下:

从上面可以看到被扫描到的动态生成的RESTServiceDiscovery数据信息了。

此时我们访问FooResource中的这个car()方法:

访问命令如下:

$ http -v "http://localhost:8080/links/car"

返回结果如下:

可以看到因为Car这个class里面没有RESTServiceDiscovery的instance,所以相关数据不会被ObjectLinksProvider自动注入。

以上就是resteasy-links模块的分析过程。

Powered by Jekyll and Theme by solid