Java Spring 枚举 Jackson Serializer 用于数据插入/获取

Sim*_*n30 5 java spring json jackson spring-mongo

我正在尝试在我的项目中使用枚举,并且需要使用小写而不是大写将它们保存在 mongoDB 集合中。

我有一个带有值 String 字段的枚举和用 Jackson 的@JsonCreator和注释的 setter/getters @JsonValue

public enum State {
    GREEN   ("vert"),
    ORANGE  ("orange"),
    RED     ("rouge");

    private final String value;

    State(String val) {
        this.value = val;
    }

    @JsonCreator
    public static State fromValue(String value) {
        if (value != null) {
            for (State state : values()) {
                if (state.value.equals(value)) {
                    return state;
                }
            }
        }

        throw new IllegalArgumentException("Invalid state: " + value);
    }

    @JsonValue
    public final String toValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个使用这个枚举的类,如下所示:

@Document(collection = "my_collec")
public class MyClass {

    @Id
    private ObjectId _id;

    @Field("st")
    private State state;
.....
}
Run Code Online (Sandbox Code Playgroud)

它适用于@RequestBody我的路线,但是当我尝试从 mongodb 获取一些数据(其中枚举保存为小写字符串)时,它每次都会失败,但出现以下异常:

java.lang.IllegalArgumentException: No enum constant package.enums.State.vert
at java.lang.Enum.valueOf(Enum.java:238) ~[na:1.8.0_171]
.....
Run Code Online (Sandbox Code Playgroud)

此外,当我使用存储库保存一些数据时,保存的枚举始终是大写的。我在带注释的函数中放置了断点,并且代码从未执行。

然后我也尝试使用@JsonGetter& @JsonSetter@JsonProperty但它从未起作用...我也尝试使用自定义序列化器/反序列化器(StdSerializer并且JsonSerializer得到相同的结果。

有谁知道我在这里缺少什么?

我很抱歉在这里再写一篇关于该主题的帖子,我几乎浏览了所有这些帖子,但没有找到可行的解决方案。提前致谢

PS:我找到了一个 hack 让它工作,但我真的不喜欢它,因为我们正在解析 getter/setter 中的枚举并将其存储为模型中的 Stirng。