Интеграция springfox-swagger2:3.0.0

Добрый день.

Для клиентов общающихся с приложением через rest в DTO используется @JsonView, что позволяет использовать один и тот же класс для API разных клиентов. Сваггер до версии 3.0.0 не поддерживает @JsonView, поэтому результат его работы не получается использовать (для клиента сформированные структуры невалидны). Поэтому к проекту подключается springfox-swagger2:3.0.0.

После подключения приложение перестает запускаться в режиме дебага со следующей ошибкой:

Ошибка

Caused by: java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.swagger.schema.ApiModelPropertyPropertyBuilder] from ClassLoader [java.net.URLClassLoader@4d41cee]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:481) ~[spring-core-5.2.20.RELEASE.jar:5.2.20.RELEASE]
at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321) ~[spring-core-5.2.20.RELEASE.jar:5.2.20.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267) ~[spring-beans-5.2.20.RELEASE.jar:5.2.20.RELEASE]
… 75 common frames omitted
Caused by: java.lang.NoClassDefFoundError: io/swagger/annotations/ApiModelProperty
at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) ~[na:na]
at java.base/java.lang.Class.getDeclaredMethods(Class.java:2309) ~[na:na]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463) ~[spring-core-5.2.20.RELEASE.jar:5.2.20.RELEASE]
… 77 common frames omitted
Caused by: java.lang.ClassNotFoundException: io.swagger.annotations.ApiModelProperty
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
… 81 common frames omitted

Причина этой ошибки в том, что springfox-swagger2:3.0.0 среди своих зависимостей имеет две следующие:

  • io.swagger.core.v3:swagger-annotations:2.1.2
  • io.swagger:swagger-annotations:1.5.21

По содержанию они полностью отличаются (первая для Open API 3, вторая для Swagger 2), но имеют одинаковое название и, как указано в документации к платформе:

В случае транзитивных зависимостей и конфликта версий будет использована стандартная стратегия разрешения версий Maven. Согласно этой стратегии, релизные версии имеют приоритет над snapshot-версиями, а более точный числовой квалификатор имеет приоритет над более общим. При прочих равных, строковые квалификаторы приоритизируются в алфавитном порядке

при дебаге в shared/lib попадает только swagger-annotations-2.1.2.jar.

Подскажите пожалуйста есть ли способ “принудить” gradle добавлять вторую, а именно swagger-annotations-1.5.21.jar, параллельно с swagger-annotations-2.1.2.jar при дебаге/сборке.

Окружение:
Linux Mint 20.3 Cinnamon
Intellij Idea 2020.3.3 pluging cuba 15.9-202
cuba-platform:7.2.19
resp-api:7.2.4

Пример проекта с подключенной springfox-swagger2:3.0.0 прилагаю.

Спасибо.
swaggerthethird.zip (83.4 КБ)

Добрый день,
Я бы добавил в build.gradle вашего проекта дополнительное действие doLast к задаче deploy, чтобы копировать в shared/lib необходимую библиотеку.
Пример doLast{} тут:

Пример кода, как cuba gradle плагин копирует библиотеки в tomcat - тут:

Заметьте, что сборка WAR или UberJAR не использует задачу deploy, и там нужно будет отдельно обрабатывать эту библиотеку в других задачах.

Спасибо. Попробую. По результату отпишусь.

Еще раз спасибо. Получилось. Пример приложения прилагаю.
swaggerthethird.zip (101.8 КБ)