泽西岛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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用HTML5技术控制电脑或手机上的摄像头

移动设备和桌面电脑上的客户端API起初并不是同步的。最初总是移动设备上先拥有某些功能和相应的API&#xff0c;但慢慢的&#xff0c;这些API会出现在桌面电脑上。其中一个应用接口技术就是getUserMedia API&#xff0c;它能让应用开发者访问用户的摄像头或内置相机。下面就展示…

好的,每个接触Java字节码的人

Oracle诉Google一案认为&#xff0c;复制Java API的结构&#xff0c;序列和组织是侵犯版权的行为。 侵犯版权不仅是复制行为&#xff0c;而且还适用于拥有该作品副本的所有中间方。 那就是编写/编译任何JVM语言的人&#xff0c;以及在他们拥有的任何设备上都有JAR文件的人&…

手动安装boost库

手动安装boost库。 1,下载boost库&#xff0c;解压到目录。我解压的目录为D:\thirdParty。2&#xff0c;build bjam工具。 转到 D:\thirdParty\boost_1_37_0\tools\jam\src目录&#xff0c;执行build.bat即可生成bin.ntx86目录&#xff0c;里面有个bjam.exe&#xff0c;以后bui…

iSlide——图标库、图示库的用法

iSlide中&#xff0c;有一个“图示库”功能&#xff0c;主要功能是同时排列多块文字或多张图片。单击插图库&#xff0c;会弹出一个新的对话框。从中&#xff0c;可以选择权限、分类、数量数据和样式&#xff0c;也可以直接搜索。 下面就举一个例子&#xff1a;我要开一个班队会…

NSMutableDictionary中 setValue和setObject的区别

对于- (void)setValue:(id)value forKey:(NSString *)key;函数 官方解释如下 Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey: 这就很明确的说明了setValue&#xff1a;forKey&#xff1a;中value能够为nil&…

IFrame标签的两个用法介绍

1. 作为弹出层铺底覆盖 大家如果做过那种黑色遮罩盖住整张页面&#xff0c;而碰巧用户用的是IE6&#xff0c;更碰巧的是页面上有select元素&#xff0c;那就有得头疼了&#xff08;原理就不在这里赘述了&#xff09;。我们会发现弹出的DIV没法遮住select, 轮到我们的iframe出场…

[C++ rudiment][转]typedef 使用

typedef似乎很简单&#xff0c;如typedef int integer&#xff1b;然而&#xff0c;这些简单的typedef语句容易让人产生一种误解&#xff0c;typedef就是一种宏替换,把后面的自定义类型替换成前面的已知类型&#xff0c;事实是这样的吗?显然不是&#xff01;首先可以肯定的是&…

预留空间过大的OutOfMemoryError

在分配一个应该很适合我为JVM提供的堆中的数据结构时&#xff0c;为什么会出现OutOfMemoryError&#xff1f; 这是我最近遇到的一个问题。 确实&#xff0c;当查看开发人员要完成的工作并通过-Xmx参数对提供给JVM的堆大小进行三重检查时&#xff0c;似乎确实存在着一些可疑之处…

查看系统剩余空间

1.剩余空间&#xff1a;df -h 2.追踪最耗费硬盘的文件位置 cd /du -h --max-depth1 | sort -rn 转载于:https://www.cnblogs.com/xiaobiaomei/p/10669159.html

【转】理解POCO

理解POCO(Plain Old CLR Object)先要理解POJO。 1、什么是POJO? POJO的名称有多种&#xff0c;pure old java object 、plain ordinary java object 等。  按照Martin Fowler的解释是“Plain Old Java Object”&#xff0c;从字面上翻译为“纯洁老式的java对象”&#xff0c…

『ExtJS』01 001. ExtJS 4 类的定义

ExtJS 4 类的定义类的定义与类方法的调用 样例代码// Define new class Vehicle under the Cookbook namespaceExt.define(Cookbook.Vehicle, {// class configuration goes hereManufacturer : Aston Martin,Model : Vanquish,getDetails : function() {alert(I am an this…

HashMap底层实现原理及面试问题

①HashMap的工作原理 HashMap基于hashing原理&#xff0c;我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时&#xff0c;它调用键对象的hashCode()方法来计算hashcode&#xff0c;让后找到bucket位置来储存值对象。当获取对象时&#xff0c;通过键对象…

Neo4j 2.1:传递节点ID与UNWIND

在发布Neo4j 2.1时&#xff0c;我们将具有UNWIND子句&#xff0c;该子句使处理事物集合更加容易。 在我的有关创建邻接矩阵的博客文章中&#xff0c;我们想要显示按字母顺序排列的前5个见面组中有多少人&#xff0c;然后检查其他各组中有多少人。 没有UNWIND子句&#xff0c;…

使用C#調用外部程式或是執行DOS命令

在.NET裡要如何調用外部程式呢?? 在.net裡&#xff0c;提供了Process類&#xff0c;提供我們強大的調用外部工具功能&#xff0c;並透過重新導向輸入與輸出&#xff0c;可以取得執行結果&#xff0c;下面就用一個例子來示範在一個WinForm裡輸入一個Dos命令&#xff0c;然後呼…

flex 学习篇 ---- 导航类容器

导航类容器需要使用<mx:ViewStack />。可以直接从ui设计器中拉控件过去舞台或者手动敲代码。 导航类容器就是相当于创建了一个菜单&#xff0c;然后按每个选项都可以进入到不同的页面。 创建了<mx:ViewStack>之后需要为它指定id号。 <mx:ViewStack id"vi…

SQLiteOpenHelper+ContentProvider的使用

效果图&#xff1a; PetDbHelper package com.example.admin.pets;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.example.admin.pets.PetContract.PetEntry;public class PetDb…

[Mac入门] 如果更快的打开程序或文件

今天有位网友问我在Windows下可以用CtrlR快速打开程序/文件夹等&#xff0c;在Mac下有没有相类似的功能&#xff1f;本文将介绍一些我的一般做法。 1.Windows下的CtrlR是什么&#xff1f; 我打算从解释CtrlR开始说起&#xff0c;希望朋友们别嫌烦&#xff5e;。Windows下系统全…

Install Shield制作安装包技巧(SQL篇)

1、检查SQL Server是否安装prototype CheckSQL(); function CheckSQL()BOOL bSuccess;NUMBER nType, nvSize;STRING szVer; STRING szSetupVer, szSetupPath;beginRegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );szSetupPath "SOFTWARE\\Microsoft\\MSSQLServer\\Setup&quo…

ActiveMQ –经纪人网络解释–第4部分

在前面的第3部分中 &#xff0c;我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来&#xff0c;这有助于确定从消息生产者到使用者的较短路径。 在第4部分中&#xff0c;我们将研究如何在远程代理上负载均衡并发使用者。 让我们考虑一些高级配置&#xff0c;以平…

总结CSS3新特性(选择器篇)

CSS3新增了嗯- -21个选择器,脚本通过控制台在这里运行; ~: p ~ p {color : red;/*此条规则将用于p后边所有的p...就是除了第一个p的所有p,规则同p:not(:nth-of-type(1)),但是权重要低于后者*/} [attribute^value]: 选择该属性以特定值开头的元素 [attribute$value]: 选择该属…