Spring HATEOAS

一.簡介

????????Spring HATEOAS的目標是解決兩個問題:link?creation(創(chuàng)建鏈接)及representation assembly(集合表述)。

二.創(chuàng)建鏈接

????????HATEOAS的核心是鏈接。鏈接的存在使得客戶端可以動態(tài)發(fā)現(xiàn)其所能執(zhí)行的動作秋茫。

HATEOAS生成鏈接的幾種方式:

① 靜態(tài)生成鏈接

????????Spring HATEOAS使用 org.springframework.hateoas.Link 類來表示鏈接法褥∪枋浚可以繼承自 Spring HATEOAS 提供的 org.springframework.hateoas.Resource 類抵乓,Resource 類提供了簡單的方式來創(chuàng)建鏈接。

Eg:

Link link1 = new Link("http://localhost:8080/something");

② 動態(tài)生成鏈接

????????在創(chuàng)建資源的鏈接時阎抒,指向單個資源的鏈接的href屬性值是類似“http://localhost:8080/lists/1”這樣的格式。而其中的“/lists”不應該是硬編碼的消痛,否則當修改了 ListRestController 類的“@RequestMapping”時且叁,所有相關的生成鏈接的代碼都需要進行修改。Spring HATEOAS 提供了 org.springframework.hateoas.mvc.ControllerLinkBuilder 來解決這個問題秩伞,用來根據(jù) Spring MVC 控制器動態(tài)生成鏈接逞带。

Eg:

//通過slash方法找到下一級欺矫,生成自身鏈接

Link link = linkTo(PersonController.class).slash(person.getId()).withSelfRel();

//如果實體類實現(xiàn)Identifiable接口

Link link = linkTo(PersonController.class).slash(person).withSelfRel();

//通過指定類的方法,生成rel為"items"的鏈接

Link link = linkTo(methodOn(ItemRestController.class).readItems(listId)).withRel("items");

③ 通過實體類創(chuàng)建單個鏈接

????????首先需要添加Maven依賴掰担,此外還需要在控制器類中通過“@ExposesResourceFor”注解聲明其所暴露的模型類汇陆,另外在 Spring 應用的配置類中需要通過“@EnableEntityLinks”注解來啟用 EntityLinks 功能。

Eg:

<dependency>

?<groupId>org.springframework.plugin</groupId>

?<artifactId>spring-plugin-core</artifactId>

?<version>1.1.0.RELEASE</version>

</dependency>


@RestController

@ExposesResourceFor(List.class)

@RequestMapping("/lists")

public class ListRestController {

@Autowired

private EntityLinks entityLinks;

entityLinks.linkForSingleResource(List.class, 1) ?

}

????????需要注意的是带饱,為了linkForSingleResource方法可以正常工作毡代,控制器類中需要包含訪問單個資源的方法,而且其“@RequestMapping”是類似“/{id}”這樣的形式勺疼。

④Model—>ModelResource

????????繼承ResourceAssemblerSupport類教寂,并根據(jù)ModelRestController與ModelResource進行相應配置。

//組裝單個資源對象

new ModelResourceAssembler().toResource(model);

//組裝資源對象的集合

Resources<ModelResource> resources = new Resources<ModelResource>(new ModelResourceAssembler().toResources(models));

二.集合表述

①Resource資源

????????繼承Resource類执庐,在ModelResource類中可以根據(jù)實體參數(shù)進行自定義封裝酪耕,并向ModelResource中添加自定義鏈接。

Eg:

public class ChartResource extends Resource {????public ChartResource(Chart chart) throws Exception {????????super(chart);????????Long chartId = chart.getId();???????? add(linkTo(methodOn(ChartRestController.class).getDimensions(chartId)).withRel("dimensions"));//維度???????? add(linkTo(methodOn(ChartRestController.class).getConditions(1)).withRel("conditions"));//條件????}}

結(jié)果如下:

"id":?1,

"title":?"房價監(jiān)管",

"_links":?{

"dimensions":?{"href":?"http://localhost:8088/charts/1/dimensions"}, "conditions":?{"href":?"http://localhost:8088/charts/1/conditions"}, "self":?{"href":?"http://localhost:8088/charts/1"}

}

②_embedded子集合

????????首先是內(nèi)嵌資源在_embedded對應的哈希對象中的屬性值轨淌,該屬性值是由 org.springframework.hateoas.RelProvider 接口的實現(xiàn)來提供的迂烁。對于應用來說,只需要在內(nèi)嵌資源對應的模型類中添加 org.springframework.hateoas.core.Relation 注解即可.

@Relation(value = "list", collectionRelation = "lists")

public class List extends AbstractEntity {

}

CurieProvider API

????????使用URL作為鏈接的關系帶來的問題是 URL 作為屬性名稱來說顯得過長递鹉,而且不同關系的 URL 的大部分內(nèi)容是重復的盟步。為了解決這個問題,可以使用 Curie躏结。簡單來說却盘,Curie 可以作為鏈接關系 URL 的模板。鏈接的關系聲明時使用 Curie 的名稱作為前綴媳拴,不用提供完整的 URL黄橘。應用中聲明的 Curie 出現(xiàn)在_links 屬性中。

@Bean

public CurieProvider curieProvider() {

return new DefaultCurieProvider("todo",

new UriTemplate("http://www.midgetontoes.com/todolist/rels/{rel}"));

}

注意:CurieProvider每個應用程序范圍只能定義一個bean

獲取鏈接屬性:

String?content =?"{'_links' : ?{ 'foo' : { 'href' : '/foo/bar' }}}";

LinkDiscoverer?discoverer =?new?HalLinkDiscoverer();

Link?link =?discoverer.findLinkWithRel("foo",?content);

assertThat(link.getRel(),?is("foo"));

assertThat(link.getHref(),?is("/foo/bar"));

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屈溉,一起剝皮案震驚了整個濱河市塞关,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌语婴,老刑警劉巖描孟,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砰左,居然都是意外死亡匿醒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門缠导,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉羔,“玉大人,你說我怎么就攤上這事僻造”锼” “怎么了孩饼?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竹挡。 經(jīng)常有香客問我镀娶,道長,這世上最難降的妖魔是什么揪罕? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任梯码,我火速辦了婚禮,結(jié)果婚禮上好啰,老公的妹妹穿的比我還像新娘轩娶。我一直安慰自己,他們只是感情好框往,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布鳄抒。 她就那樣靜靜地躺著,像睡著了一般椰弊。 火紅的嫁衣襯著肌膚如雪许溅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天秉版,我揣著相機與錄音闹司,去河邊找鬼。 笑死沐飘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牲迫。 我是一名探鬼主播耐朴,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盹憎!你這毒婦竟也來了筛峭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陪每,失蹤者是張志新(化名)和其女友劉穎影晓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檩禾,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡挂签,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盼产。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵婆。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戏售,靈堂內(nèi)的尸體忽然破棺而出侨核,到底是詐尸還是另有隱情草穆,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布搓译,位于F島的核電站悲柱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏些己。R本人自食惡果不足惜豌鸡,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴总。 院中可真熱鬧直颅,春花似錦、人聲如沸怀樟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽往堡。三九已至械荷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虑灰,已是汗流浹背吨瞎。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穆咐,地道東北人颤诀。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像对湃,于是被迫代替她去往敵國和親崖叫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容