【发布时间】:2020-11-12 16:47:23
【问题描述】:
在使用 Spring MVC 的 REST api 中,如果我想将可以作为 http GET 请求参数传递的字符串值限制为以下之一
值A 价值B
我认为我应该在 java 中使用 Enum 类型。
public enum MyEnum {
@JsonProperty("valueA")
VALUE_A("valueA"),
@JsonProperty("valueB")
VALUE_B("valueB");
private final String label;
private MyEnum(String label) {
this.label = label;
}
@Override
public String toString() {
return this.label;
}
@JsonValue
public String getLabel() {
return label;
}
}
然而,这仅处理 Enum 的序列化。当我在 spring 控制器中收到 valueA 作为 requestParam 时,有一个 ConversionFailedException 因为
我已阅读以下文章https://www.baeldung.com/spring-enum-request-param,但我的问题是,有没有比编写自定义转换器更简单的解决方案。
我不想为我想在我的 REST api 中交换的每个枚举编写和注册一个转换器。
我也试过这个,但是 spring mvc 似乎没有调用 forValue 来反序列化参数。
公共枚举 MyEnum {
VALUE_A("valueA"),
VALUE_B("valueB");
private final String label;
private MyEnum(String label) {
this.label = label;
}
@Override
public String toString() {
return this.label;
}
@JsonValue
public String getLabel() {
return label;
}
@JsonCreator
public MyEnum forValue(String label) {
for (MyEnum enum: MyEnum .values()) {
if (enum.getLabel().equals(label)) {
return enum;
}
}
throw new IllegalArgumentException("Can't find MyEnum Enum to match :" + label);
}
}
【问题讨论】:
-
这可能使用常规类/Bean 对象,但您在这里处理的是枚举,所以我猜您需要做一个自定义转换器。
-
您是否考虑过在自定义方法上使用
@JsonCreator来执行反序列化? -
我已经在我的示例中添加了@JsonCreator 的问题,但是 Spring MVC 没有调用它来反序列化 RequestParam 参数.. 我认为这是有道理的,因为参数是字符串而不是 json。 .. ;)