泽西岛2.9及更高版本中的声明式链接
幾個星期前幾個月前,我正在尋找如何為Oracle Cloud項目設計新的REST API。 我計劃要做的事情之一就是使用Marc Hadley在Jersey 1.x中創建的聲明性鏈接注入。 可悲的是這并沒有被轉發移植然而,這樣一個快速的聊天項目帶動和我承擔了使代碼最新的小中型工作。
新版本中發生的更改之一是,在JAX-RS 2.0中,存在一個Link對象,因此除了只能注入String和URI之外,還可以注入正確的rel屬性。 這意味著,由Marc編碼的現有注釋已合并到用于Link標頭和注入屬性的簡單注釋集中。
現在可以使用此功能以及一個簡單的示例。 我提交的功能的原始版本有一些嚴重的限制,稍后將進行介紹,您將需要版本2.8的Jersey Jersey,或者可以構建包含當前更改的2.9-SNAPSHOT映像以實現此博客中的示例。
該博客著眼于使用這個新的API為collections API提供簡單的注入。 RESTful服務(尤其是基于JSON的服務)中的常見模式之一是在結構的頂層具有一系列結構鏈接。 就本博客而言,我將遵循Collection + JSON超媒體類型的形式。
{ "collection" :{"version" : "1.0","href" : "http://example.org/friends/?offset=10&limit=10","links" : [{"rel" : "create", "href" : "http://example.org/friends/"}{"rel" : "next", "href" : "http://example.org/friends/?offset=20&limit=10"}{"rel" : "previous", "href" : "http://example.org/friends/?offset=0&limit=10"}],"items" : [...]} }因此,我可以按以下形式插入鏈接,為清楚起見,這里沒有一堆鍋爐板。 這不是最整齊的代碼; 但在以后的周期中,應該可以對它們進行一些簡單的設置。 該設計當前使用EL來訪問屬性-這樣做的優點是可以在表示屬性時寫回值。 我可以理解有些人不喜歡它。 但我不確定目前是否可以轉向JavaScript。 也不要被@Xml注釋所代替,我使用MOXy進行JSON生成–這不是XML唯一的事情。
{@XmlTransientprivate int limit, offset; // Getters for these@XmlTransientprivate int modelLimit; // Getters for these@InjectLink(resource = ItemsResource.class,method = "query",style = Style.ABSOLUTE,bindings = {@Binding(name = "offset", value="${instance.offset}"),@Binding(name = "limit", value="${instance.limit}")},rel = "self")@XmlElement(name="link")private String href;@InjectLinks({@InjectLink(resource = ItemsResource.class,style = Style.ABSOLUTE,method = "query",condition = "${instance.offset + instance.limit < instance.modelLimit}",bindings = {@Binding(name = "offset", value = "${instance.offset + instance.limit}"),@Binding(name = "limit", value = "${instance.limit}")},rel = "next"),@InjectLink(resource = ItemsResource.class,style = Style.ABSOLUTE,method = "query",condition = "${instance.offset - instance.limit >= 0}",bindings = {@Binding(name = "offset", value = "${instance.offset - instance.limit}"),@Binding(name = "limit", value = "${instance.limit}")},rel = "prev")})@XmlElement(name="link")@XmlElementWrapper(name = "links")@XmlJavaTypeAdapter(Link.JaxbAdapter.class)List<Link> links;.... }聲明性鏈接代碼的原始移植存在于2.8之前的Jersey版本中,它具有很幼稚的代碼,可以計算出特定資源的URI應該是什么,它不能處理不在應用程序根目錄下的任何資源。 ,也無法應付在處理集合時非常重要的查詢參數。
從理論上講,一個特定的資源類可以有多個URI。 但是此代碼確實需要假設1:1映射,當前的實現包含一個簡單的算法,該算法會遍歷Jersey元模型以嘗試計算結構,這對您不起作用,您可以簡單地提供另一個實現ResourceMappingContext 。
有人可能會問,當我自己注入URI更容易時,為什么應該使用這些丑陋的注釋? 原因是提供其他工具可以使用的元數據。 我的下一個工作之一是擴展這項工作以生成超媒體擴展,為此,我需要上面的元數據。 (等待拉動請求在我真正加入之前得到批準)。
最后,值得注意的是,分頁模型有其自身的問題,如果您將REST集合視為可以安全地分頁的某種數組,則這些問題就變得顯而易見。 并發更新以及缺少狀態意味著客戶端永遠無法確定自己擁有完整的模型,并且應該期望在更新模型時多次看到某些項目。 應該考慮使用基于游標或鏈接的方案,這再次提醒了您為什么總是將URI視為不透明–服務器將來可能需要更改其結構。 但這是另一天完全不同的博客…..
翻譯自: https://www.javacodegeeks.com/2014/05/declarative-linking-in-jersey-2-9-and-up.html
總結
以上是生活随笔為你收集整理的泽西岛2.9及更高版本中的声明式链接的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 安卓vcf通讯录导入苹果(安卓vcf)
- 下一篇: 四川网站备案(四川省备案网)
