我有一些带有以下方法的球衣servlet:
@GET
@Path("/setState")
public String setState(@QueryParam("objId") int objId, @QueryParam("state") ObjectState state) {
/// bla bla bla ...
}
枚举ObjectState
定义为:
public enum ObjectState {
VISIBLE,
HIDDEN,
SELECTED,
SHADOWED
}
目前,要使客户调用该方法,他们必须将状态提及为字符串,例如&state=HIDDEN
。
我想使客户能够传递序数值,而不是包含其名称的字符串。例如,&state=2
将意味着该值为SELECTED
。
目前,我通过将参数类型更改为整数,然后手动找到枚举值来手动进行以下操作,而不是非常优雅,解决方法:
:public String setState(@QueryParam("objId") int objId, @QueryParam("state") int state) {
ObjectState stateAsEnumVal = stateAsEnumVal.values()[state];
// bla bla bla ...
}
是否可以自动且优雅地进行选择?
带有@QueryParam
和其他@XxxParam
,允许使用非关键(和非列表)类型,如果允许它们遵循四个规则之一:
- 类具有接受字符串的构造函数。
- 类具有静态
valueOf(String)
方法,该方法返回类型。 - 类具有静态
fromString(String)
方法,该方法返回类型。 - 有一个可以处理类型的
ParamConverter/ParamConverterProvider
。
枚举从开箱即用的原因是因为所有枚举都包含在返回类型的静态valueOf
方法中。但这是没有用的,因为它期望枚举的字符串值作为参数。
我们可以做的是添加静态fromString(String)
方法。泽西岛足够聪明,可以知道如果枚举中有fromString(String)
方法,则应尝试将该方法称为valueOf
方法。
因此您可以做
之类的事情public enum ObjectState {
VISIBLE,
HIDDEN,
SELECTED,
SHADOWED;
public static ObjectState fromString(String param) {
int value = Integer.parseInt(param);
return ObjectState.values()[value];
}
}
这应该起作用。但是,唯一的问题是您失去了客户发送字符串值的能力。
更新
或可能支持字符串和数字,您可以做
之类的事情public static ObjectState fromString(String param) {
try {
int value = Integer.parseInt(param);
return ObjectState.values()[value];
} catch (NumberFormatException ex) {
return valueOf(param)
}
}
在这里,如果整数解析失败,则可以尝试使用默认的valueOf
。