Skip to content

Latest commit

 

History

History
100 lines (85 loc) · 2.57 KB

README.md

File metadata and controls

100 lines (85 loc) · 2.57 KB

considering the following enums:

public static enum EnumSerializedByName {
    A("name a"),
    B("name b");

    String label;

    EnumSerializedByName(String label) {
        this.label = label;
    }

    @Override
    public String toString() {
        return label;
    }
}
public static enum EnumSerializedByToString {
    A("str a"),
    B("str b");

    String label;

    EnumSerializedByToString(String label) {
        this.label = label;
    }

    @Override
    @JsonValue // Forces serialization using toString()
    public String toString() {
        return label;
    }
}
public static enum BijectiveEnumSerializedByToString {
    A("bij a"),
    B("bij b");

    String label;

    BijectiveEnumSerializedByToString(String label) {
        this.label = label;
    }

    @Override
    @JsonValue // Forces serialization using toString()
    public String toString() {
        return label;
    }

    public static BijectiveEnumSerializedByToString fromString(String str) {
        for (final var e : BijectiveEnumSerializedByToString.values()) {
            if (Objects.equals(e.toString(), str)) {
                return e;
            }
        }
        return null;
    }

    @Component
    static class StringEnumSerializedByToStringConverter implements Converter<String, BijectiveEnumSerializedByToString> {
        @Override
        public BijectiveEnumSerializedByToString convert(String source) {
            return BijectiveEnumSerializedByToString.fromString(source);
        }
    }
}

with Spring default:

  • HttpMessageConverter beans
  • Converter<String, EnumSerializedByName>
  • Converter<String, EnumSerializedByToString>

the generated spec is:

  "components": {
    "schemas": {
      "Dto": {
        "required": ["bij", "name", "str"],
        "type": "object",
        "properties": {
          "name": { "type": "string", "enum": ["name a", "name b"] },
          "str": { "type": "string", "enum": ["str a", "str b"] },
          "bij": { "type": "string", "enum": ["bij a", "bij b"] }
        }
      }
    }
  }

This is:

  • wrong for EnumSerializedByName wich is always serialized using name() and deserialised using valueOf()
  • right for BijectiveEnumSerializedByToString
  • right for EnumSerializedByToString when HttpMessageConverter beans are used (@RequestBody and @ResponseBody), but wrong when the default Converter<String, EnumSerializedByToString> is used (@RequestParam)