gpt4 book ai didi

java - Jersey:接受 Enum 请求参数的整数

转载 作者:行者123 更新时间:2023-11-30 02:53:32 26 4
gpt4 key购买 nike

我有一些 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 表示该值为 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) 方法。 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)
}
}

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

关于java - Jersey:接受 Enum 请求参数的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com