java - example - Generando JsonSchema desde pojo: ¿cómo agrego "descripción" automáticamente?
json schema validator java example (3)
Intento generar automáticamente JsonSchema a partir de pojos en mi proyecto: el código se ve así:
ObjectMapper mapper = new ObjectMapper();
SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
mapper.acceptJsonFormatVisitor(clazz, visitor);
JsonSchema jsonSchema = visitor.finalSchema();
String schemaString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
Cuando clazz se define así:
public class ZKBean
{
public String anExample;
public int anInt;
}
I end up with this:
{
"type" : "object",
"id" : "urn:jsonschema:com:emc:dpad:util:ZKBean",
"properties" : {
"anInt" : {
"type" : "integer"
},
"anExample" : {
"type" : "string"
}
}
}
Todo eso es genial. Lo que quiero hacer es agregar la clave de "descripción" al esquema, para que en cambio tenga algo que se parezca a:
{
"type" : "object",
"id" : "urn:jsonschema:com:emc:dpad:util:ZKBean",
"properties" : {
"anInt" : {
"type" : "integer",
"description" : "Represents the number of foos in the system"
},
"anExample" : {
"type" : "string",
"description" : "Some descriptive description goes here"
}
}
}
Supuse que había alguna anotación que podría poner en los campos de mi clase ZKBean, pero después de medio día de aprendizaje no encontré ninguna. ¿Es este el camino a seguir? ¿O debo hacer algo con mi visitante?
Gracias, Jesse
Puede usar la anotación @JsonPropertyDescription
para generar el esquema json que funciona desde Jackson 2.4.1. Aquí hay un ejemplo:
public class JacksonSchema {
public static class ZKBean {
@JsonPropertyDescription("This is a property description")
public String anExample;
public int anInt;
}
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
mapper.acceptJsonFormatVisitor(ZKBean.class, visitor);
JsonSchema jsonSchema = visitor.finalSchema();
System.out.println(mapper
.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema));
}
}
Salida:
{
"type" : "object",
"id" : "urn:jsonschema::JacksonSchema:ZKBean",
"properties" : {
"anExample" : {
"type" : "string",
"description" : "This is a property description"
},
"anInt" : {
"type" : "integer"
}
}
}
Parece que el problema no radica en las bibliotecas de jackson, sino en el paquete que estoy utilizando para generar los objetos de la clase. Mi código está pegado a continuación; Sospecho que el objeto Reflections está soltando la información de la anotación (cuando manualmente especifico ZKBean.class aparece la descripción). ¡Gracias por la ayuda!
Reflections reflections = new Reflections(
new ConfigurationBuilder().setUrls(
ClasspathHelper.forClassLoader(urlcl)).
addClassLoader(urlcl));
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(JsonBean.class);
ObjectMapper mapper = new ObjectMapper();
SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
for (Class<?> clazz : annotated)
{
try
{
mapper.acceptJsonFormatVisitor(mapper.constructType(SampleBean.class), visitor);
JsonSchema jsonSchema = visitor.finalSchema();
String schemaString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
System.out.println(schemaString);
Tuve el mismo problema e identifiqué otra posible causa (simplemente agregué con la esperanza de que esto podría ayudar a alguien).
También estoy cargando objetos Class (de DTO POJOs con anotaciones Jackson) usando un ClassLoader personalizado y los he procesado con ObjectMapper y SchemaFactoryWrapper para generar los esquemas JSON correspondientes. En mi caso, olvidé agregar el jarro de anotaciones jackson al ClassLoader, lo que lleva al problema descrito.