Spingfox не распознает пользовательский сериализатор при создании модели JSON для чванства

Мое приложение jhipster v2.23.1 использует пользовательские сериализаторы и десериализаторы для разбора JSON, которые я регистрирую как модуль в JacksonConfiguration. REST API работает, как и ожидалось, с использованием моего пользовательского сопоставления.

Однако JSON, отображаемый в автоматически созданной документации swagger, не отражает пользовательское сопоставление. Я надеялся, что swagger автоматически обнаружит пользовательские сериализаторы/десериализаторы, но, поскольку это не так, как я могу заставить swagger отображать мой пользовательский формат JSON вместо того, который он обнаруживает сам по себе?

На основе документации Springfox по адресу http://springfox.github.io/springfox/docs/current/#configuring-springfox я реализовал интерфейс:

ApplicationListener<ObjectMapperConfigured> 

в моем bean-компоненте SwaggerConfiguration. Я вижу, что метод onApplicationEvent(ObjectMapperConfigured event) вызывается дважды. В первый раз маппер сериализует мой объект, как и ожидалось, во второй раз - нет. Также не имеет значения, зарегистрирую ли я свой модуль в картографе или нет. Объект, с которым я здесь работаю, — это контакт.

@Override
public void onApplicationEvent(ObjectMapperConfigured event) {
    ObjectMapper mapper = event.getObjectMapper();

    // Custom serialization for Contact objects
    SimpleModule contactModule = new SimpleModule("Contact Module");
    contactModule.addSerializer(new ContactSerializer(Contact.class));
    contactModule.addDeserializer(Contact.class, new ContactDeserializer(Contact.class));

    mapper.registerModule(contactModule);

    // My custom object
    Contact c = new Contact();
    c.setCity("Springfield");
    c.setEmail("[email protected]");

    String contactJsonStr = null;
    try {
        contactJsonStr = mapper.writeValueAsString(c);
    } catch(JsonProcessingException e) {
        e.printStackTrace();
    }
    System.out.println("Serialized Contact: " + contactJsonStr);
}

Как я могу заставить Springfox использовать мой пользовательский сериализатор для создания моей документации по чванству? Или я должен использовать совершенно другой подход?


person codemonkey    schedule 16.11.2015    source источник
comment
Вы должны спросить проект Springfox   -  person Gaël Marziou    schedule 28.11.2015
comment
@GaëlMarziou Об этом дважды спрашивали, но ничего не сделано, github.com/swagger -api/swagger-core/issues/1753 github.com/springfox/springfox/ вопросы/1639   -  person DaithiG    schedule 05.08.2021
comment
Тогда вы должны внести свой вклад   -  person Gaël Marziou    schedule 05.08.2021


Ответы (1)


Эй, я знаю, что это старый вопрос, но я наткнулся на ту же проблему и провел небольшое исследование.

Решение довольно простое. Напишите класс, который представляет ваш собственный сериализованный объект. Затем просто используйте файл directModelSubstitute в методе Docket, чтобы заменить исходный класс модели сериализованной моделью.

Если ваш сериализатор делает что-то подобное для сериализации DateTime в UNIX Time (Long)

public void serialize(final DateTime value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException, JsonProcessingException {
        long millis = value.getMillis();
        gen.writeNumber(millis);
}

Просто добавьте .directModelSubstitute(DateTime.class, Long.class) эту строку в определение Docket.

person Ohmen    schedule 07.10.2016