泽西岛:接受枚举请求参数的整数



我有一些带有以下方法的球衣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,允许使用非关键(和非列表)类型,如果允许它们遵循四个规则之一:

  1. 类具有接受字符串的构造函数。
  2. 类具有静态valueOf(String)方法,该方法返回类型。
  3. 类具有静态fromString(String)方法,该方法返回类型。
  4. 有一个可以处理类型的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

最新更新