如果你有一个像这样的枚举:
public enum AnimalType {
BIG_BIRD,
SMALL_CAT,
MEDIUM_DOG;
}
那么为了让 JAX-RS 知道要返回什么实例,您的查询参数必须是 ?animal=BIG_BIRD
,?animal=SMALL_CAT
或?animal=MEDIUM_DOG
.
查询参数的值被馈送到valueOf
枚举的静态方法以获取实例。当然,如果你发送其他类似的bird
东西,它不会匹配任何东西,它也不会工作,因为@QueryParam
期望这样:
带注释的参数、字段或属性的类型 T 必须:
- 是原始类型
- 有一个接受单个字符串参数的构造函数
- 有一个名为 valueOf 的静态方法,它接受单个字符串参数(例如,参见 Integer. 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();
}