当前位置: 首页 > 知识库问答 >
问题:

Java REST枚举序列化和Spring

范鸿
2023-03-14

在使用Spring MVC的REST api中,如果我想将可以作为超文本传输协议GET请求参数传递的字符串值限制为以下参数之一

价值A价值B

我认为我应该在java中使用枚举类型。

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控制器中接收value eA作为请求Param时,会出现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);
    }

}

共有1个答案

宰父宾实
2023-03-14

如果您不想编写转换器,当然可以使用Spring的StringToEnumConverterFactory,它要求您按字面形式发送枚举文字-因此在您的情况下,值a或值B。如果您决定用文字以外的任何其他值来标识枚举,您只需要一个更复杂的转换器,但请注意,拥有自己的转换器的方法也有它的注意事项,正如我们在您的示例中看到的那样,因为与枚举文字(编译器检查其是否唯一)相比,例如,您的值不一定是唯一的,就像在您的示例中,两个文字都有值“valueA”,因此映射不会不同。

 类似资料:
  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • 我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:

  • 问题内容: 枚举被认为是单例的最佳方式,其原因之一是它隐式继承。 但是,枚举如何防止单例的反序列化问题? 问题答案: 序列化机制以特殊的特定方式处理它们。但是,可以通过定义返回唯一实例的方法来对传统的单例进行反序列化。有关示例,请参见http://www.oodesign.com/singleton- pattern.html 。

  • 如何用gson 2.2.4序列化和反序列化像这样的简单枚举?

  • 问题内容: 我有一个下面的枚举: 我用控制器()返回枚举数组,Spring将其序列化为以下json字符串: 强迫Jackson像POJO一样序列化枚举的最佳方法是什么?例如: 我使用了不同的注释,但无法获得这样的结果。 问题答案: 终于我找到了解决方案。 我必须用注释枚举并实现自定义序列化程序: