Java Jersey:接受枚举请求参数的整数

Java Jersey:接受枚举请求参数的整数,java,jersey,Java,Jersey,我使用以下方法创建了一些Jersey servlet: @GET @Path("/setState") public String setState(@QueryParam("objId") int objId, @QueryParam("state") ObjectState state) { /// bla bla bla ... } 其中,枚举ObjectState定义为: public enum ObjectState { VISIBLE, HIDDEN,

我使用以下方法创建了一些Jersey 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
将意味着该值已被选中

目前,我手动执行此操作,通过将参数类型更改为整数,然后手动查找枚举值,解决了以下不太优雅的问题:

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)
    方法。Jersey非常聪明,知道如果枚举中有
    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)
        }
    }
    
    这应该行得通。但是,唯一的问题是客户端无法发送字符串值


    更新 或者,为了同时支持字符串和数字,您可以执行以下操作

    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)
        }
    }
    

    如果整数解析失败,可以尝试使用默认的

    我想我看到一个问题,说这是自动发生的,OP想禁用该行为。您是否尝试过保持代码不变,并通过2而不是选择?是的,我尝试过,但它返回错误代码404,因为它找不到使用这种方法调用的方法parameters@dabadaba-我该怎么做?@JBNizet-你说的关于杰克逊的话是正确的,但也许泽西改变了这个设置。您可以在这里看到,默认情况下,枚举的
    编号失败
    False