Адрес фактического центра электронной коммерции SpringBoot (35k+star):GitHub.com/macro-positive/…
Резюме
посмотри наmall
Старый стиль документации Swagger API в проекте, в этот раз я наконец-то решил его обновить. В процессе обновления есть много подводных камней, но при правильном использовании Maven это не проблема!
Выберите версию обновления
Сначала мы выбираем версию, которую необходимо обновить, и переходим непосредственно в репозиторий Maven, чтобы посмотреть, какая версия используется больше. Хотя последняя версия2.10.x
, но его почти никто не использует, а предыдущая версия2.9.x
Есть много людей, которые используют его, но кажется, что2.9.x
Версия относительно стабильная, мы выбираем обновление до2.9.2
Версия.
Обновить Сваггер
Далее мы можем приступить к обновлению версии Swagger.Исходный проект использовал
2.7.0
Версия.
- так как
mall
Проект использует родительский проект для унифицированного управления зависимостями, поэтому просто измените версию зависимостей Swagger в родительском проекте, а файл pom.xml родительского проекта находится в корневом каталоге проекта;
<properties>
<swagger2.version>2.9.2</swagger2.version>
</properties>
- бегать
mall-admin
Проект обнаружил, что не может быть запущен, и сообщение об ошибке было следующим: не удалось найти метод в зависимости, на первый взгляд, это былоguava
Внутри предполагается, что это проблема версии;
***************************
APPLICATION FAILED TO START
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
springfox.documentation.schema.DefaultModelDependencyProvider.dependentModels(DefaultModelDependencyProvider.java:79)
The following method did not exist:
com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;
The method's class, com.google.common.collect.FluentIterable, is available from the following locations:
jar:file:/C:/Users/macrozheng/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar!/com/google/common/collect/FluentIterable.class
It was loaded from the following location:
file:/C:/Users/macrozheng/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterable
Process finished with exit code 1
- Когда есть несколько зависимостей, использующих разные версии
guava
Как Maven выбирает пакет? Maven выбирается по принципу близости, и чем мельче уровень, тем больше шансов, что он будет выбран;
- Рекомендуется использовать
Maven Helper
Этот плагин IDEA, прямой просмотрmall-admin
Если в проекте есть конфликт зависимостей, версия гуавы действительно конфликтует;
- Его можно найти путем наблюдения
minio
Этот уровень зависимости является самым поверхностным, поэтому используется его версия для гуавы, и его можно исключить напрямую;
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
- После завершения исключения обнаруживается, что конфликт зависимостей гуавы исчез, запустите его снова
mall-admin
Установлено, что проект работает нормально;
- Когда мы получили доступ к документу Swagger, мы обнаружили другую проблему, и было сообщено об исключении NumberFormatException;
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:601)
at java.lang.Long.valueOf(Long.java:803)
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412)
- Причина в том, что когда мы используем аннотацию @ApiModelProperty в качестве типа данных Long, если вы не добавите
example
Property, значением по умолчанию является пустая строка, и преобразование пустой строки, естественно, сообщит об исключении NumberFormatException;
/**
* 修改订单费用信息参数
* Created by macro on 2018/10/29.
*/
@Getter
@Setter
public class OmsMoneyInfoParam {
@ApiModelProperty(value = "订单ID",example = "1")
private Long orderId;
}
- Мы использовали много аннотаций @ApiModelProperty, их невозможно добавить по одной, но с новой версией
swagger-annotations
иswagger-models
Пакет зависимостей можно решить, поэтому наша зависимость Swagger становится следующей:
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!--解决Swagger 2.9.2版本NumberFormatException-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
-
бежать снова
mall-admin
Выяснено, что проблема решена.Как только мы обнаружим неподходящие зависимости в maven, мы их устраним, а затем введем соответствующие версии зависимостей.Хорошо ли это делать? -
Фактически, мы можем использовать функцию наследования проекта Maven, чтобы напрямую указать версию зависимости в родительском проекте, чтобы можно было унифицировать версии зависимостей подпроектов;
-
поставь оригинал
pom.xml
Конфигурация, исключающая guava и swagger, удаляется, а затем изменяется файл pom.xml в корневом каталоге, чтобы указать номер версии;
<properties>
<swagger2.version>2.9.2</swagger2.version>
<swagger-models.version>1.6.0</swagger-models.version>
<swagger-annotations.version>1.6.0</swagger-annotations.version>
<guava.version>20.0</guava.version>
</properties>
- Добавьте соответствующие зависимости, которым требуется унифицированное управление, в узел управления зависимостями родительского проекта, и обновление версии Swagger будет завершено;
<dependencyManagement>
<dependencies>
<!--Swagger-UI API文档生产工具-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<!--解决Swagger 2.9.2版本NumberFormatException-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger-annotations.version}</version>
</dependency>
<!--统一Guava版本防止冲突-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
- Когда мы настроим Token для доступа к интерфейсу, требующему разрешения, мы обнаружим, что интерфейс под брендом, продуктом и категорией продукта имеет разрешение на доступ, а другие подсказки не имеют разрешения, потому что мы использовали следующую конфигурацию для настройки путь, требующий аутентификации при входе в систему;
@Configuration
@EnableSwagger2
public class Swagger2Config {
private List<SecurityContext> securityContexts() {
//设置需要登录认证的路径
List<SecurityContext> result = new ArrayList<>();
result.add(getContextByPath("/brand/.*"));
result.add(getContextByPath("/product/.*"));
result.add(getContextByPath("/productCategory/.*"));
return result;
}
}
- Вы можете изменить его на все пути. Это немного отличается от старой версии. Старая версия обращается ко всем интерфейсам с токеном в информации заголовка, а новая версия будет содержать токен только для настроенного пути.
@Configuration
@EnableSwagger2
public class Swagger2Config {
private List<SecurityContext> securityContexts() {
//设置需要登录认证的路径
List<SecurityContext> result = new ArrayList<>();
result.add(getContextByPath("/*/.*"));
return result;
}
}
Сравнение интерфейса новой и старой версии
После того, как Swagger обновился до версии 2.9.2, интерфейс сразу стал красивым, давайте сравним старый и новый интерфейсы.
старая версия
новая версия
Адрес исходного кода проекта
публика
проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на общедоступный номерПолучите это прямо сейчас.