swagger-core
                                
                                 swagger-core copied to clipboard
                                
                                    swagger-core copied to clipboard
                            
                            
                            
                        Jackson annotations ignored on enum class
I have a dataclass that is used as a field in complex request and response bodies. The class uses JsonFormat to have custom serialisation:
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum User {
    FOO(1, "Bar");
    User(int id, String name) {
        this.id = id;
        this.name = name;
    }
    private int id;
    private String name;
}
I would expect it to be serialised as:
"User" : {
    "properties" : {
        "id" : {
            "format" : "int32",
            "type" : "integer"
        },
        "name" : {
            "type" : "string"
        }
    },
    "type" : "object"
}
Unfortunately it gets serialised as:
"user" : {
    "enum" : [ "FOO" ],
    "type" : "string"
}
I have tried the workarounds listed in https://github.com/swagger-api/swagger-core/issues/2969, but it seems like most enum class-level Jackson annotations are currently ignored.
The only workaround I found was:
class UserSer {
    @JsonProperty
    private int id;
    @JsonProperty
    private String name;
}
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Schema(implementation = UserSer.class)
public enum User {
   ...
}
I believe the current problem resides in this line of the ModelResolver:
https://github.com/swagger-api/swagger-core/blob/0144bff2df1aba025412678a64c7e60f515d0b88/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java#L281-L285
Any class with Java enum type will always be serialised as a String Schema.
I found this to be quite hard to work around as I wished to reuse ModelResolver's logic for bean serialisation and I did not wish to duplicate that logic in a custom ModelConverter.
tl;dr:
- Jackson annotations are disregarded when serializing enum classes [feature request]
- ModelResolverwill serialize a Bean enum class always as a- StringSchemadisregarding all annotations (- @Schema(type = "object")does not work) [a bug imo]
As a QoL change for (2) I would recommend splitting out the bean serialisation from the main resolve method of ModelResolver to allow it to be invoked by subclasses which could then specify a custom base schema.
Hi guys, any idea how to workaround this problem with this dependency as we dont have @Schema annotation ?