What I have:
I'm generating a JSON schema from a pojo. My code to generate the schema looks like so:
ObjectMapper mapper = new ObjectMapper(); TitleSchemaFactoryWrapper visitor = new TitleSchemaFactoryWrapper(); mapper.acceptJsonFormatVisitor(clazz, visitor); JsonSchema schema = visitor.finalSchema(); schemas.put(clazz, mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema));
I'm generating several schemas via the above code. One of the pojos has an internal embedded enum to limit the possible values, like so:
public class MyClass { @JsonProperty("name") private String name; @JsonProperty("startDayOfWeek") private MyClass.StartDayOfWeek startDayOfWeek; /** * The ID of a timezone returned by the timezones route. * */ @JsonProperty("timezone") private String timezone; @JsonIgnore private Map additionalProperties = new HashMap(); /** * * @return * The startDayOfWeek */ @JsonProperty("startDayOfWeek") public MyClass.StartDayOfWeek getStartDayOfWeek() { return startDayOfWeek; } /** * * @param startDayOfWeek * The startDayOfWeek */ @JsonProperty("startDayOfWeek") public void setStartDayOfWeek(MyClass.StartDayOfWeek startDayOfWeek) { this.startDayOfWeek = startDayOfWeek; } public static enum StartDayOfWeek { MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"), SATURDAY("Saturday"), SUNDAY("Sunday"); private final String value; private static Map constants = new HashMap(); static { for (MyClass.StartDayOfWeek c: values()) { constants.put(c.value, c); } } private StartDayOfWeek(String value) { this.value = value; } @JsonValue @Override public String toString() { return this.value; } @JsonCreator public static MyClass.StartDayOfWeek fromValue(String value) { MyClass.StartDayOfWeek constant = constants.get(value); if (constant == null) { throw new IllegalArgumentException(value); } else { return constant; } } } }
The above code should limit the possible String values in the JSON data that's passed around to "Monday", "Tuesday", "Wednesday", etc.
When I run the schema generator on the code in question, I expect to get something like the following schema:
{ "type" : "object", "javaType" : "my.package.MyClass", "properties": { "startDayOfWeek" : { "type" : "string", "enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] } } }
but instead I'm getting this:
{ "type" : "object", "id" : "urn:jsonschema:my:package:MyClass", "title" : "Lmy/package/MyClass;", "properties" : { "startDayOfWeek" : { "type" : "string" } } }
I've done some digging in the Jackson Schema Module source code and figured out that what's happening is Jackson's using ".toString()" as the default serialization method for enum types, but what I need it to do instead is create the line that looks like this based on StartDayOfWeek.values()
:
"enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
Does anyone know how to do that?