2015-10-21 13 views
7

http://www.example.com/rest/foo?barのようなURLを使用したいのですが、barクエリパラメータに値がなく、その存在だけで変数がtrueまたはfalseであることを示す必要があります。@QueryParamは値を持たないパラメータをブール値 "false"に変換する方法を教えてください。

現在、欠損値は""(空)とみなされ、new Boolean()に渡され、falseとして扱われます。

パラメータをStringに指定してそれを自分で変換するよりも、より洗練された定義方法がありますか?

クラスjavax.rs.BooleanFlagまたはそれに類するもの?あなたは次のことを試みることができる

+0

リソースを削除する場合、なぜ 'DELETE'メソッドを使用しないのですか? –

+0

私の場合は統計を生成しましたが、後でこの統計のために使用されたレコードを削除する必要があります。パラメータの名前を無視してください。これは私の質問とは無関係で、今編集します! :) – lathspell

答えて

5

@GET 
@Path("/some-path") 
public Response myMethod(@Context HttpServletRequest request) { 

    boolean isParameterPresent = request.getParameterMap().contains("bar"); 

    ... 
} 

しかしpeeskillet's answerに示した解決策は、それを達成するための賢い方法です。

+0

それは、ありがとう、働く。メソッドシグネチャがこのパラメータに関する情報を完全に欠いているのは残念です。 (私は自動WADL生成の大きな友人ではありませんが、時にはいいです...) – lathspell

8

パラメータをStringと宣言し、それを自分で変換するよりも、より洗練された定義方法がありますか?例えばのように。クラスjavax.rs.BooleanFlagまたはそれに類するもの?あなたはjavadoc for @QueryParamを見れば

はありません、このようなタイプ(BooleanFlag)、あなたは私たちが@QueryParam値を使用するようにカスタムタイプを作成する方法のオプションのリストが表示されます(ほとんどの部分でも同じことが当てはまりますまた、他の@XxxParam秒)のために

  • static方法はvalueOfまたは単一の文字列引数を受け入れfromStringを命名した単一の文字列引数を受け取るコンストラクタを持っている(、Fを参照してください例:Integer.valueOf(String)
  • 登録済みのParamConverterProviderの実装があり、タイプの「文字列から」変換可能なParamConverterインスタンスを返すJAX-RS拡張SPIインスタンスがあります。

照会フラグが存在しているときに、最初のオプションから、理論的には、あなたが

public class Flag { 

    private final boolean isPresent; 
    public Flag(String param) { isPresent = param != null; } 
    public boolean isPresent() { return isPresent; } 
} 
@GET 
public String get(@QueryParam("bar") Flag bar) { 
    if (bar.isPresent()) { 
     return "bar is present"; 
    } else { 
     return "bar is not present"; 
    } 
} 

ような何かを行うことができるはず今、これは動作します。しかし、そうでないときは、他の非プリミティブ型と同じように動作します。それはnullです。したがって、bar.isPresentの呼び出しはNPEを与えます。 fromStringvalueOfでテストし、同じ結果を得ました。我々チェックif (bar == null)することができますが、それは単に文字列を使用し、文字列がnullであるかどうかをチェックするだけで良いことはありません。それはかなりではありません。

最後のオプションはParamConverterProviderです。どちらが実際に動作しますか。以下は実装です。

import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 
import javax.ws.rs.ext.ParamConverter; 
import javax.ws.rs.ext.ParamConverterProvider; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class FlagParamConverterProvider implements ParamConverterProvider { 

    @Override 
    public <T> ParamConverter<T> getConverter(
      Class<T> rawType, Type genericType, Annotation[] annotations) { 
     if (rawType != Flag.class) { 
      return null; 
     } 

     return new ParamConverter<T>() { 

      @Override 
      public T fromString(String value) { 
       return (T)new Flag(value); 
      } 

      @Override 
      public String toString(T value) { return null; } 
     }; 
    } 
} 

プロバイダが登録されていることを確認してください。それは私の意見ではきれいな解決策です。

+0

私のクラスに 'bar'パラメータを与えなければ、' Flag'オブジェクトは 'null'なので、私はまだ 'bar == null 'をチェックする必要がありますか? false:bar.isPresent() ' –

5

私はそれが古い質問だと知っていますが、私は同じ問題がありました。私の問題を解決するために

、私は注釈@defaultValueを使用:だから

@GET 
@Path("/path") 
public Response myMethod(@DefaultValue("true") @QueryParam("foo") boolean foo) { 
    if (foo) { 
     ... 
    } 
} 

、リクエストパラメータfooが含まれている場合、ブール値がfalseになるとされていない場合、それはtrueになります。それは現実の反対を示していますが、あなたがそれを認識していれば、それは使い方が簡単です。

関連する問題