validator example java json jackson jsonschema

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.