簡體   English   中英

在rest webservice url中處理單個查詢參數的多個值,並使用hibernate條件處理它們

[英]Handling multiple values for a single query parameter in a rest webservice url and handling them using hibernate criteria

我有一個休息的Web服務,它接受'name'並從db獲取帶有此名稱的令牌並返回令牌。 其余web服務的URL將是:

http://localhost:8080/NameService/Tokens?name=Bob

在serviceLayer中,我的方法如下:

@GET
@Path("Tokens")
@Produces("application/xml")
public JAXBElement<GetToken> getokenByName(@QueryParam("name") final String name ) {

    if(name!=null){
        // use hibernate criteria to fetch the records from db
        Criteria crit = getSession().createCriteria(getPersistentClass());
        crit.add(Restrictions.eq("name",name))
    }
}

現在,當客戶端可以同時在請求中發送多個名稱時,我們對需求進行了更改。例如,給我一個其中name =“bob”或“brendon”或“aaron”的標記URL可以是這樣的:

http://localhost:8080/NameService/Tokens?name=Bob,Aaron,Brendon

發送的名稱數量是可變的。 它可以是1或2或3等。 有關如何通過調整上面顯示的代碼來實現這種拆分並將它們作為OR條件傳遞給hibernate條件的任何想法,這些代碼適用於一個名稱?

一種方法可能是使用StringUtils使用分隔符(逗號)解析出不同的名稱,然后形成一個列表,以及如何將列表中的名稱添加到條件限制中。 但不確定這是否有效。

有任何想法嗎?

實際上,最簡單的方法是使用split(",")拆分查詢參數。

您還可以將查詢參數設置為List<String>並傳遞如下參數:

http://localhost:8080/NameService/Tokens?name=Bob&name=Aaron&name=Brendon

或者您也可以實現自己的StringReaderProvider並將其注冊到澤西。

對於你的評論:你應該使用析取。

@GET
@Path("Tokens")
@Produces("application/xml")
public JAXBElement<GetToken> getokenByName(@QueryParam("name") final String names) {
    if (names != null) {
        Criteria crit = getSession().createCriteria(getPersistentClass());
        Disjunction disjunction = Restrictions.disjunction(); 
        for (String name: names.split(",")) {
            disjunction = disjunction.add(Restrictions.eq("name", name));
        } 
        crit.add(disjunction);
    }
    ...
}

你分裂字符串的想法是有效的。 您還可以檢查一些REST服務在行業中的完成情況。 查看linkedin人員搜索API

使用正則表達式檢查@Path注釋的靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM