Rest控制器,提供枚举名称,但将其值保存在数据库中

时间:2018-08-03 15:30:15

标签: java spring spring-boot enums jackson-databind

我的问题似乎既简单又复杂。我有一个Display类,它有一个枚举,即DisplayMode。

public class Display {

  private DisplayMode mode;
  //getters and setters

  public enum DisplayMode {
    BIG("display.mode.big"),
    SMALL("display.mode.small"),
    MEDIUM("display.mode.medium");

    private String modeValue;

    DisplayMode(String modeValue) {
        this.modeValue = modeValue;
    }

    public String toString() {
        return this.name() + "/" + this.modeValue;
    }

    public String getModeValue() {
        return this.modeValue;
     }
  }
}

现在,我有一个rest控制器,它以JSON格式接收Display,即

{"display": {"mode": "BIG"}}

它正以

的形式保存在MongoDB中
{"display": {"mode": "BIG"}}

我想要的是,如果收到其余请求,则显示为

{"display": {"mode": "BIG"}} or 
{"display": {"mode": "big"}} or anyCase insensitive value

应将其另存为数据库

{"display": {"mode": "display.mode.big"}}

当我想读取“通过rest控制器显示”时,它应该与保存在数据库中的显示相同。

使用Serilizer和Deserializer或其他方法的任何解决方案。谢谢

1 个答案:

答案 0 :(得分:1)

使用@JsonValue保存值&& @JsonCreator进行反序列化。

@JsonValue
final String modeValue() {
    return this.modeValue;
}

对于反序列化:

@JsonCreator
    public static DisplayMode forValue(String v) {
        return Arrays.stream(DisplayMode.values())
                .filter(dm -> dm.name().equalsIgnoreCase(v))
                .findAny().orElse(null);
    }