resteasy-links的研究(七)
这篇文章里,我们通过一个例子看一下ClassLinksProvider
的使用方法。首先要创建一个样例项目,这个样例项目放在了这里:
在这个例子里,首先做一个数据class叫做Car
:
这个class里面的重点是它没有RESTServiceDiscovery
的实例:
因此,如果要针对这个class动态创建一个RESTServiceDiscovery
的实例,就要用到ClassLinksProvider
的能力。
因此结合上篇文章所讲,我们把ClassLinksProvider
应用在我们自己service的方法里:
可以看到这个service是使用ClassLinksProvider
的getLinks()
方法来从一个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
模块的分析过程。