3

「名前」を受け入れ、この名前でデータベースからトークンを取得し、トークンを返す残りのWebサービスがあります。残りの 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))
    }
}

クライアントがリクエストで複数の名前を同時に送信できる場合の要件が変更されました。

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

送信される名前の数は可変です。1 か 2 か 3 などです。この分割を実現し、上記のコードを調整してサービス層の OR 条件として Hibernate 基準に渡す方法についてのアイデアはありますか?これは 1 つの名前で機能しますか?

1 つの方法としてStringUtils、区切り文字 (コンマ) を使用してさまざまな名前を解析し、リストを作成して、リスト内の名前を条件制限に追加する方法があります。しかし、これが機能するかどうかはわかりません。

何か案は?

4

2 に答える 2

5

実際、最も簡単な方法は、を使用してクエリ パラメータを分割することsplit(",")です。

クエリ パラメータを a に設定して、次のList<String>ようにパラメータを渡すこともできます。

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

または、独自のものを実装StringReaderProviderして jersey に登録することもできます。

あなたのコメントのために:選言を使用する必要があります。

@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 サービスが業界でどのように行われているかを確認することもできます。リンクされた人の検索 API を確認する

@Path正規表現を使用して注釈の柔軟性を確認します。

于 2012-09-13T17:45:30.323 に答える