2014-09-10 77 views
10

是否有可能允許查詢方法@Params是可選的,特別是在Spring Data REST的情況下?帶可選@Param的彈簧數據查詢方法

例如,我想將一個非常相似的搜索綁定到相同的資源路徑。現在做到這一點,我需要像下面這樣:

@RestResource(path = "driver", rel = "byDriver") 
List<Bar> findByDriverId(@Param("id") String id, Pageable pageable); 

@RestResource(path = "driverAndSpan", rel = "byDriverAndSpan") 
List<Bar> findByDriverIdAndStartTimeGreaterThanEqualAndEndTimeLessThanEqual(@Param("id") String id, @Param("start") Date start, 
     @Param("end") Date end, Pageable pageable); 

這給了我:

byDriver: { 
    href: "http://localhost:8080/foo/search/driver{?id,page,size,sort}", 
}, 
byDriverAndSpan: { 
    href: "http://localhost:8080/foo/search/driverAndSpan{?id,start,end,page,size,sort}", 
} 

什麼是能夠看到類似下面的路徑,其中startend是可選參數,而不是在我的Repository中定義多個方法。

byDriverAndSpan: { 
    href: "http://localhost:8080/foo/search/driverAndSpan{?id,*start,*end,page,size,sort}", 
} 

這有可能是這樣的:

@RestResource(path = "driverAndSpan", rel = "byDriverAndSpan") 
List<Bar> findByDriverIdAndStartTimeGreaterThanEqualAndEndTimeLessThanEqual(@Param("id") String id, @Param(value = "start", optional = true) Date start, 
     @Param(value = "end", optional = true) Date end, Pageable pageable); 
+0

挖出一箇舊的帖子......我很驚訝沒有人提到[Querydsl](http://www.querydsl.com/),這正是你可以使用。 – 2017-04-07 08:32:07

回答

0

不,這是目前不支持。如果是這樣,那麼就會存在模棱兩可的風險。可能有傳入網址可能匹配超過1個@RestResource的情況。

爲了從一個Java的角度解釋,假設我們可以定義了兩個方法:

getPerson(String firstName, int age); 

getPerson(String firstName, {Optional} int age, int phoneNumber); 

會有問題,當一個人的目標是要調用的第二種方法,不提供年齡,但被映射到電話號碼的第一種方法是作爲一個年齡讀取的。

+0

怎麼會有模棱兩可的風險?參數具有(唯一)名稱。 – Nefreo 2017-01-11 22:35:14

+0

您是否在請求中提供參數名稱? – UserF40 2017-01-12 11:19:57

+2

OP聲明他希望沿着'http:// localhost:8080/foo/search/driverAndSpan {?id,* start,* end,page,size,sort}'的方向行事''。在這種情況下,參數是按名稱提供的,所以不應該有空間存在歧義。 – Nefreo 2017-01-12 14:24:51