【问题标题】:Java REST Enum serialization and SpringJava REST Enum 序列化和 Spring
【发布时间】: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。 .. ;)

标签: java spring rest enums


【解决方案1】:

如果您不想编写转换器,您当然可以退回到 Spring 的 StringToEnumConverterFactory,它要求您按字面意思发送 Enum 文字 - 所以在您的情况下是 VALUE_AVALUE_B。如果您决定通过除字面量之外的任何其他值来识别枚举,则只需要一个更复杂的转换器,但请注意,拥有自己的转换器的方法有它的警告,正如我们在您的示例中看到的那样,因为与 Enum 相比文字(由编译器检查是否唯一) e。 G。您的值 必须是唯一的,例如在您的示例中,两个文字都具有值“valueA”,因此映射不会是不同的。

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2018-05-25
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多