Создать схему json из POJO

Мне нужно сгенерировать схему json из моих POJO. Требование состоит в том, что каждый POJO должен быть экспортирован как отдельный файл, а ссылки внутри схемы json должны обрабатываться соответствующим образом. Это означает, что библиотека должна отслеживать, какой POJO экспортируется в какой файл. Я нашел эту библиотеку: https://github.com/mbknor/mbknor-jackson-jsonSchema, и она отлично работает, но кажется (или, по крайней мере, я не могу найти такую ​​​​опцию), что я не могу выполнить требования без специального кодирования. Знаете ли вы какую-либо другую библиотеку, которая поддерживает это?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 895
1

Ответы 1

Вы можете использовать Джексона для создания схемы JSON, используя следующие зависимости maven

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
 <groupId>com.fasterxml.jackson.module</groupId>
 <artifactId>jackson-module-jsonSchema</artifactId>
 <version>2.9.8</version>
</dependency>
<dependency>
 <groupId>org.reflections</groupId>
 <artifactId>reflections</artifactId>
 <version>0.9.11</version>
</dependency>

Затем вы можете сгенерировать схему, написав что-то вроде этого

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);

    Reflections reflections = new Reflections("my.pojo.model",new SubTypesScanner(false));
    Set<Class<?>> pojos = reflections.getSubTypesOf(Object.class);
    Map<String, String> schemaByClassNameMap = pojos.stream()
            .collect(Collectors.toMap(Class::getSimpleName, pojo -> getSchema(mapper, schemaGen, pojo)));
    schemaByClassNameMap.entrySet().forEach(schemaByClassNameEntry->writeToFile(schemaByClassNameEntry.getKey(),schemaByClassNameEntry.getValue()));

}

private static void writeToFile(String pojoClassName, String pojoJsonSchema) {
    try {
        Path path = Paths.get(pojoClassName + ".json");
        Files.deleteIfExists(path);
        byte[] strToBytes = pojoJsonSchema.getBytes();
        Files.write(path, strToBytes);
    }catch (Exception e){
        throw new IllegalStateException(e);
    }
}

private static String getSchema(ObjectMapper mapper,JsonSchemaGenerator schemaGenerator,Class clazz){
    try {
        JsonSchema schema = schemaGenerator.generateSchema(clazz);
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
    }catch (Exception e){
        throw new IllegalStateException(e);
    }
}

спасибо за ваше предложение! библиотека, которую я пробовал, основана на Джексоне, и я не вижу никакого способа выполнить требования, которые у меня есть. я что-то пропустил?

Plamen Paskov 30.01.2019 14:00

Вы включили зависимость jackson-module-jsonSchema?

Vadim 30.01.2019 14:49
github.com/mbknor/mbknor-jackson-jsonSchema основан на Джексоне. Библиотека mbknor, похоже, не соответствует моим требованиям, поэтому я ожидаю того же от Джексона.
Plamen Paskov 30.01.2019 15:05

@PlamenPaskov обновленная версия кода теперь также будет записываться в файл

Vadim 30.01.2019 16:57

Другие вопросы по теме