3

我有一个休息网络服务,它将接受“名称”并使用此名称从数据库中获取令牌并将令牌返回。其余网络服务的 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))
    }
}

现在我们的需求发生了变化,客户端可以在请求中同时发送多个名称。例如,给我令牌 where name = "bob" or "brendon" or "aaron" 的 URL 可能是这样的:

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

发送的姓名数量是可变的。它可以是 1 或 2 或 3 等等。关于如何通过调整上面显示的代码(适用于一个名称)来实现这种拆分并将它们作为服务层中的 OR 条件传递给休眠条件的任何想法?

一种方法可能是StringUtils使用分隔符(逗号)解析不同的名称,然后形成一个列表以及如何将列表中的名称添加到条件限制中。但不确定这是否有效。

有任何想法吗?

4

2 回答 2

5

实际上,最简单的方法是使用split(",").

您还可以将查询参数设置为 aList<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);
    }
    ...
}
于 2012-09-13T17:45:56.607 回答
0

您拆分字符串的想法将起作用。您还可以查看一些 REST 服务在行业中是如何完成的。检查linkedin人员搜索API

@Path使用正则表达式检查注释的灵活性。

于 2012-09-13T17:45:30.323 回答