次のような列挙型がある場合:
public enum AnimalType {
BIG_BIRD,
SMALL_CAT,
MEDIUM_DOG;
}
?animal=BIG_BIRD
次に、JAX-RS が返すインスタンスを認識できるようにするには、クエリ パラメータを、?animal=SMALL_CAT
またはにする必要があります ?animal=MEDIUM_DOG
。
クエリ パラメータの値がvalueOf
列挙型の静的メソッドに渡され、インスタンスが取得されます。もちろん、次のようなものを送信するbird
と、何にも一致せず、次のことが@QueryParam
期待されるため機能しません。
注釈付きのパラメーター
、フィールド、またはプロパティの型 T は、次のいずれかでなければなりませ
ん
。 valueOf(String))
- List、Set、または SortedSet で、T は上記の 2 または 3 を満たします。結果のコレクションは読み取り専用です。
について@DefaultValue
も同様です。@DefaultValue("BIG_BIRD")
、@DefaultValue("SMALL_CAT")
または@DefaultValue("MEDIUM_DOG")
:を指定する必要があります。
@POST
@Path("/zoo")
public Response createNewAnimal(
@QueryParam("animal")
@DefaultValue("SMALL_CAT") AnimalType type) {
// ...
return Response.ok().entity(type.toString()).build();
}
Java 型の名前をクライアントに公開したくない場合は、適切なクエリ文字列値を列挙型インスタンスに変換できます。if ... else ... if はこれを実現するための非常に簡単な方法ですが、より手の込んだものが必要な場合は、次のようなラッパーを作成できます。
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class AnimalTypeWrapper {
private static final Map<String, AnimalType> MAPPER = Collections
.unmodifiableMap(new HashMap<String, AnimalType>() {
{
put("bird", AnimalType.BIG_BIRD);
put("dog", AnimalType.MEDIUM_DOG);
put("cat", AnimalType.SMALL_CAT);
}
});
private AnimalType type;
public static AnimalTypeWrapper valueOf(String value) {
AnimalType type = AnimalTypeWrapper.MAPPER.get(value.toLowerCase());
if (type == null) {
// if nothing found just set the desired default value
type = AnimalType.SMALL_CAT;
}
return new AnimalTypeWrapper(type);
}
private AnimalTypeWrapper(AnimalType type) {
this.type = type;
}
public AnimalType getType() {
return this.type;
}
}
リソースメソッドには次のものがあります。
@POST
@Path("/zoo")
public Response createNewAnimal(
@QueryParam("animal")
AnimalTypeWrapper typeWrapper) {
// ...
AnimalType type = typeWrapper.getType();
return Response.ok().entity(type.toString()).build();
}