为什么 HATEOAS 在使用 Swagger 2.x 启动期间开始为 spring-boot 版本> = 2.2.x 创建问题?

Why HATEOAS starts creating issue for spring-boot version >= 2.2.x during startup with Swagger 2.x?

我将我的项目从 spring-boot 2.1.9 移动到 2.2.0。

在启动项目时,我面临以下 error 消息。

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'linkDiscoverers' defined in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]: Unsatisfied dependency expressed through method 'linkDiscoverers' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





***************************

APPLICATION FAILED TO START

***************************



Description:





Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration 

required a single bean, but 17 were found:

- modelBuilderPluginRegistry: defined in null

- modelPropertyBuilderPluginRegistry: defined in null

- typeNameProviderPluginRegistry: defined in null

- syntheticModelProviderPluginRegistry: defined in null

- documentationPluginRegistry: defined in null

- apiListingBuilderPluginRegistry: defined in null

- operationBuilderPluginRegistry: defined in null

- parameterBuilderPluginRegistry: defined in null

- expandedParameterBuilderPluginRegistry: defined in null

- resourceGroupingStrategyRegistry: defined in null

- operationModelsProviderPluginRegistry: defined in null

- defaultsProviderPluginRegistry: defined in null

- pathDecoratorRegistry: defined in null

- apiListingScannerPluginRegistry: defined in null

- relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

- linkDiscovererRegistry: defined in null

- entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]

<properties>

  <java.version>1.8</java.version>

  <swagger-springfox.version>2.9.2</swagger-springfox.version>

  <sonar.jacoco.execPath>${project.basedir}/target/jacoco.exec</sonar.jacoco.execPath>

  <jasypt-spring-boot-starter>2.1.1</jasypt-spring-boot-starter>

  <logbook-spring-boot-starter>1.13.0</logbook-spring-boot-starter>

  0.8.1</assertj-swagger>

  <jacoco-version>0.8.4</jacoco-version>

</properties>

<dependencies>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-actuator</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-jpa</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-rest</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-devtools</artifactId>

    <scope>runtime</scope>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-configuration-processor</artifactId>

  </dependency>

  <dependency>

    <groupId>org.projectlombok</groupId>

    lombok</artifactId>

    <optional>true</optional>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-test</artifactId>

    <scope>test</scope>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-spring-web</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-core</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-data-rest</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-bean-validators</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>
@Configuration

@EnableSwagger2

public class SwaggerConfiguration {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }

}

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>2.0.0.RELEASE</version>

</dependency>
@Primary

@Bean

public LinkDiscoverers discoverers() {

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

}
  Use following 2 dependency to resolve Swagger and Hateoas dependency conflict.

  

  If Spring Boot version is >= 2.2.0 the use io.springfox version 3.0.0

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>3.0.0</version>

  </dependency>

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>3.0.0</version>

  </dependency>
  <dependency>

    <groupId>io.springfox</groupId>

    springfox-boot-starter</artifactId>

    <version>3.0.0</version>

  </dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-dependencies</artifactId>

 <version>2.2.6.RELEASE</version>

 <type>pom</type>

 <scope>import</scope>

</dependency>

.....

.....

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger2</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger-ui</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>${spring-plugin.version}</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>1.2.0.RELEASE</version>

</dependency>
@EnableSwagger2

@Configuration

public class SwaggerConfiguration {



  @Primary

  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

  }



  @Bean

  public Docket postsApi() {

    return new Docket(DocumentationType.SWAGGER_2)

        .groupName("{ApplicationName}")

        .apiInfo(buildApiInfo())

        .select()

        .apis(RequestHandlerSelectors.any())

        .paths(PathSelectors.regex("/.*"))

        .build();

  }



  private ApiInfo buildApiInfo() {

    Contact contact = new Contact("CompanyName","https://company-domain.com","mail@company.com");

    return new ApiInfoBuilder()

        .title(""{ApplicationName}"")

        .description("API Description")

        .license("license")

        .version("1.0")

        .contact(contact)

        .licenseUrl("licenseURl")

        .build();

  }

}
  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-hateoas</artifactId>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>2.9.2</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>2.9.2</version>

  </dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.6.1</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.6.1</version>

</dependency>
Description:



Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration required a single bean, but 3 were found:

  - relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

  - linkDiscovererRegistry: defined in null

  - entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]





Action:



Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
<dependency>

  <groupId>org.springframework.hateoas</groupId>

  spring-hateoas</artifactId>

  <version>1.1.1.RELEASE</version>

</dependency>
@Bean

public LinkDiscoverers discovers() {  

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));[enter image description here][1] 

}

<properties>

  <spring-plugin-core.version>2.0.0.RELEASE</spring-plugin-core.version>

  <springfox.version>3.0.0</springfox.version>

</properties>



<dependencyManagement>

 <dependencies>

  <!-- API Documentation -->

  <!-- Fix wrong resolved `spring-plugin-core` dependency version for springfox -->

  <dependency>

   <groupId>org.springframework.plugin</groupId>

   spring-plugin-core</artifactId>

   <version>${spring-plugin-core.version}</version>

  </dependency>

  <dependency>

   <groupId>io.springfox</groupId>

   springfox-boot-starter</artifactId>

   <version>${springfox.version}</version>

  </dependency>

 </dependencies>

</dependencyManagement>



<dependencies>

 <!-- API Documentation -->

 <dependency>

  <groupId>io.springfox</groupId>

  springfox-boot-starter</artifactId>

 </dependency>

</dependencies>

<dependency>

  <groupId>com.jayway.jsonpath</groupId>

  json-path</artifactId>

  <scope>test</scope>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>3.0.0</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.8.0</version>

</dependency>

<dependency>

 <groupId>org.springframework.hateoas</groupId>

 spring-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

package com.company.springbootworks.swagger;



import java.time.LocalDate;

import java.util.ArrayList;

import java.util.List;



import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.hateoas.client.LinkDiscoverer;

import org.springframework.hateoas.client.LinkDiscoverers;

import org.springframework.hateoas.mediatype.collectionjson.CollectionJsonLinkDiscoverer;

import org.springframework.http.ResponseEntity;

import org.springframework.plugin.core.SimplePluginRegistry;



import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger.web.DocExpansion;

import springfox.documentation.swagger.web.ModelRendering;

import springfox.documentation.swagger.web.OperationsSorter;

import springfox.documentation.swagger.web.TagsSorter;

import springfox.documentation.swagger.web.UiConfiguration;

import springfox.documentation.swagger.web.UiConfigurationBuilder;

import springfox.documentation.swagger2.annotations.EnableSwagger2;



@Configuration

@EnableSwagger2

public class SwaggerConfig {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }



  @Bean

  public Docket eDesignApi(SwaggerConfigProperties swaggerConfigProperties) {

    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(swaggerConfigProperties))

        .enable(Boolean.valueOf(swaggerConfigProperties.getEnabled())).select()

        .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build().pathMapping("/")

        .directModelSubstitute(LocalDate.class, String.class).genericModelSubstitutes(ResponseEntity.class)

        .useDefaultResponseMessages(Boolean.valueOf(swaggerConfigProperties.getUseDefaultResponseMessages()))

        .enableUrlTemplating(Boolean.valueOf(swaggerConfigProperties.getEnableUrlTemplating()));

  }



  @Bean

  UiConfiguration uiConfig(SwaggerConfigProperties swaggerConfigProperties) {

    return UiConfigurationBuilder.builder().deepLinking(Boolean.valueOf(swaggerConfigProperties.getDeepLinking()))

        .displayOperationId(Boolean.valueOf(swaggerConfigProperties.getDisplayOperationId()))

        .defaultModelsExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelsExpandDepth()))

        .defaultModelExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelExpandDepth()))

        .defaultModelRendering(ModelRendering.EXAMPLE)

        .displayRequestDuration(Boolean.valueOf(swaggerConfigProperties.getDisplayRequestDuration()))

        .docExpansion(DocExpansion.NONE).filter(Boolean.valueOf(swaggerConfigProperties.getFilter()))

        .maxDisplayedTags(Integer.valueOf(swaggerConfigProperties.getMaxDisplayedTags()))

        .operationsSorter(OperationsSorter.ALPHA)

        .showExtensions(Boolean.valueOf(swaggerConfigProperties.getShowExtensions()))

        .tagsSorter(TagsSorter.ALPHA).supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)

        .validatorUrl(null).build();

  }



  private ApiInfo apiInfo(SwaggerConfigProperties swaggerConfigProperties) {

    return new ApiInfoBuilder().title(swaggerConfigProperties.getTitle())

        .description(swaggerConfigProperties.getDescription()).version(swaggerConfigProperties.getApiVersion())

        .build();

  }

}

<properties>

  <java.version>1.8</java.version>

  <swagger.version>2.9.2</swagger.version>

  <swagger-annotations.version>1.5.21</swagger-annotations.version>

  <swagger-models.version>1.5.21</swagger-models.version>

  <spring-plugin.version>2.0.0.BUILD-SNAPSHOT</spring-plugin.version>

</properties>





<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-annotations</artifactId>

  <version>${swagger-annotations.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-models</artifactId>

  <version>${swagger-models.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.4.0</version>

</dependency>



<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.4.0</version>

</dependency>
compile group: 'io.springfox', name: 'springfox-swagger-ui', version:'2.9.2' 

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'

是什么导致了这个问题?

注意:我没有在我的 pom.xml 文件中使用 HATEOAS。

pom.xml

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'linkDiscoverers' defined in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]: Unsatisfied dependency expressed through method 'linkDiscoverers' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





***************************

APPLICATION FAILED TO START

***************************



Description:





Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration 

required a single bean, but 17 were found:

- modelBuilderPluginRegistry: defined in null

- modelPropertyBuilderPluginRegistry: defined in null

- typeNameProviderPluginRegistry: defined in null

- syntheticModelProviderPluginRegistry: defined in null

- documentationPluginRegistry: defined in null

- apiListingBuilderPluginRegistry: defined in null

- operationBuilderPluginRegistry: defined in null

- parameterBuilderPluginRegistry: defined in null

- expandedParameterBuilderPluginRegistry: defined in null

- resourceGroupingStrategyRegistry: defined in null

- operationModelsProviderPluginRegistry: defined in null

- defaultsProviderPluginRegistry: defined in null

- pathDecoratorRegistry: defined in null

- apiListingScannerPluginRegistry: defined in null

- relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

- linkDiscovererRegistry: defined in null

- entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]

<properties>

  <java.version>1.8</java.version>

  <swagger-springfox.version>2.9.2</swagger-springfox.version>

  <sonar.jacoco.execPath>${project.basedir}/target/jacoco.exec</sonar.jacoco.execPath>

  <jasypt-spring-boot-starter>2.1.1</jasypt-spring-boot-starter>

  <logbook-spring-boot-starter>1.13.0</logbook-spring-boot-starter>

  0.8.1</assertj-swagger>

  <jacoco-version>0.8.4</jacoco-version>

</properties>

<dependencies>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-actuator</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-jpa</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-rest</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-devtools</artifactId>

    <scope>runtime</scope>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-configuration-processor</artifactId>

  </dependency>

  <dependency>

    <groupId>org.projectlombok</groupId>

    lombok</artifactId>

    <optional>true</optional>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-test</artifactId>

    <scope>test</scope>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-spring-web</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-core</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-data-rest</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-bean-validators</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>
@Configuration

@EnableSwagger2

public class SwaggerConfiguration {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }

}

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>2.0.0.RELEASE</version>

</dependency>
@Primary

@Bean

public LinkDiscoverers discoverers() {

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

}
  Use following 2 dependency to resolve Swagger and Hateoas dependency conflict.

  

  If Spring Boot version is >= 2.2.0 the use io.springfox version 3.0.0

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>3.0.0</version>

  </dependency>

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>3.0.0</version>

  </dependency>
  <dependency>

    <groupId>io.springfox</groupId>

    springfox-boot-starter</artifactId>

    <version>3.0.0</version>

  </dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-dependencies</artifactId>

 <version>2.2.6.RELEASE</version>

 <type>pom</type>

 <scope>import</scope>

</dependency>

.....

.....

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger2</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger-ui</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>${spring-plugin.version}</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>1.2.0.RELEASE</version>

</dependency>
@EnableSwagger2

@Configuration

public class SwaggerConfiguration {



  @Primary

  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

  }



  @Bean

  public Docket postsApi() {

    return new Docket(DocumentationType.SWAGGER_2)

        .groupName("{ApplicationName}")

        .apiInfo(buildApiInfo())

        .select()

        .apis(RequestHandlerSelectors.any())

        .paths(PathSelectors.regex("/.*"))

        .build();

  }



  private ApiInfo buildApiInfo() {

    Contact contact = new Contact("CompanyName","https://company-domain.com","mail@company.com");

    return new ApiInfoBuilder()

        .title(""{ApplicationName}"")

        .description("API Description")

        .license("license")

        .version("1.0")

        .contact(contact)

        .licenseUrl("licenseURl")

        .build();

  }

}
  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-hateoas</artifactId>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>2.9.2</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>2.9.2</version>

  </dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.6.1</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.6.1</version>

</dependency>
Description:



Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration required a single bean, but 3 were found:

  - relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

  - linkDiscovererRegistry: defined in null

  - entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]





Action:



Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
<dependency>

  <groupId>org.springframework.hateoas</groupId>

  spring-hateoas</artifactId>

  <version>1.1.1.RELEASE</version>

</dependency>
@Bean

public LinkDiscoverers discovers() {  

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));[enter image description here][1] 

}

<properties>

  <spring-plugin-core.version>2.0.0.RELEASE</spring-plugin-core.version>

  <springfox.version>3.0.0</springfox.version>

</properties>



<dependencyManagement>

 <dependencies>

  <!-- API Documentation -->

  <!-- Fix wrong resolved `spring-plugin-core` dependency version for springfox -->

  <dependency>

   <groupId>org.springframework.plugin</groupId>

   spring-plugin-core</artifactId>

   <version>${spring-plugin-core.version}</version>

  </dependency>

  <dependency>

   <groupId>io.springfox</groupId>

   springfox-boot-starter</artifactId>

   <version>${springfox.version}</version>

  </dependency>

 </dependencies>

</dependencyManagement>



<dependencies>

 <!-- API Documentation -->

 <dependency>

  <groupId>io.springfox</groupId>

  springfox-boot-starter</artifactId>

 </dependency>

</dependencies>

<dependency>

  <groupId>com.jayway.jsonpath</groupId>

  json-path</artifactId>

  <scope>test</scope>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>3.0.0</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.8.0</version>

</dependency>

<dependency>

 <groupId>org.springframework.hateoas</groupId>

 spring-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

package com.company.springbootworks.swagger;



import java.time.LocalDate;

import java.util.ArrayList;

import java.util.List;



import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.hateoas.client.LinkDiscoverer;

import org.springframework.hateoas.client.LinkDiscoverers;

import org.springframework.hateoas.mediatype.collectionjson.CollectionJsonLinkDiscoverer;

import org.springframework.http.ResponseEntity;

import org.springframework.plugin.core.SimplePluginRegistry;



import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger.web.DocExpansion;

import springfox.documentation.swagger.web.ModelRendering;

import springfox.documentation.swagger.web.OperationsSorter;

import springfox.documentation.swagger.web.TagsSorter;

import springfox.documentation.swagger.web.UiConfiguration;

import springfox.documentation.swagger.web.UiConfigurationBuilder;

import springfox.documentation.swagger2.annotations.EnableSwagger2;



@Configuration

@EnableSwagger2

public class SwaggerConfig {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }



  @Bean

  public Docket eDesignApi(SwaggerConfigProperties swaggerConfigProperties) {

    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(swaggerConfigProperties))

        .enable(Boolean.valueOf(swaggerConfigProperties.getEnabled())).select()

        .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build().pathMapping("/")

        .directModelSubstitute(LocalDate.class, String.class).genericModelSubstitutes(ResponseEntity.class)

        .useDefaultResponseMessages(Boolean.valueOf(swaggerConfigProperties.getUseDefaultResponseMessages()))

        .enableUrlTemplating(Boolean.valueOf(swaggerConfigProperties.getEnableUrlTemplating()));

  }



  @Bean

  UiConfiguration uiConfig(SwaggerConfigProperties swaggerConfigProperties) {

    return UiConfigurationBuilder.builder().deepLinking(Boolean.valueOf(swaggerConfigProperties.getDeepLinking()))

        .displayOperationId(Boolean.valueOf(swaggerConfigProperties.getDisplayOperationId()))

        .defaultModelsExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelsExpandDepth()))

        .defaultModelExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelExpandDepth()))

        .defaultModelRendering(ModelRendering.EXAMPLE)

        .displayRequestDuration(Boolean.valueOf(swaggerConfigProperties.getDisplayRequestDuration()))

        .docExpansion(DocExpansion.NONE).filter(Boolean.valueOf(swaggerConfigProperties.getFilter()))

        .maxDisplayedTags(Integer.valueOf(swaggerConfigProperties.getMaxDisplayedTags()))

        .operationsSorter(OperationsSorter.ALPHA)

        .showExtensions(Boolean.valueOf(swaggerConfigProperties.getShowExtensions()))

        .tagsSorter(TagsSorter.ALPHA).supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)

        .validatorUrl(null).build();

  }



  private ApiInfo apiInfo(SwaggerConfigProperties swaggerConfigProperties) {

    return new ApiInfoBuilder().title(swaggerConfigProperties.getTitle())

        .description(swaggerConfigProperties.getDescription()).version(swaggerConfigProperties.getApiVersion())

        .build();

  }

}

<properties>

  <java.version>1.8</java.version>

  <swagger.version>2.9.2</swagger.version>

  <swagger-annotations.version>1.5.21</swagger-annotations.version>

  <swagger-models.version>1.5.21</swagger-models.version>

  <spring-plugin.version>2.0.0.BUILD-SNAPSHOT</spring-plugin.version>

</properties>





<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-annotations</artifactId>

  <version>${swagger-annotations.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-models</artifactId>

  <version>${swagger-models.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.4.0</version>

</dependency>



<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.4.0</version>

</dependency>
compile group: 'io.springfox', name: 'springfox-swagger-ui', version:'2.9.2' 

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'

我的 spring-boot 应用程序中的 Swagger + HATEOAS 遇到了这个问题。

下面给出了修复(编辑你的 Swagger 配置类):

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'linkDiscoverers' defined in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]: Unsatisfied dependency expressed through method 'linkDiscoverers' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





***************************

APPLICATION FAILED TO START

***************************



Description:





Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration 

required a single bean, but 17 were found:

- modelBuilderPluginRegistry: defined in null

- modelPropertyBuilderPluginRegistry: defined in null

- typeNameProviderPluginRegistry: defined in null

- syntheticModelProviderPluginRegistry: defined in null

- documentationPluginRegistry: defined in null

- apiListingBuilderPluginRegistry: defined in null

- operationBuilderPluginRegistry: defined in null

- parameterBuilderPluginRegistry: defined in null

- expandedParameterBuilderPluginRegistry: defined in null

- resourceGroupingStrategyRegistry: defined in null

- operationModelsProviderPluginRegistry: defined in null

- defaultsProviderPluginRegistry: defined in null

- pathDecoratorRegistry: defined in null

- apiListingScannerPluginRegistry: defined in null

- relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

- linkDiscovererRegistry: defined in null

- entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]

<properties>

  <java.version>1.8</java.version>

  <swagger-springfox.version>2.9.2</swagger-springfox.version>

  <sonar.jacoco.execPath>${project.basedir}/target/jacoco.exec</sonar.jacoco.execPath>

  <jasypt-spring-boot-starter>2.1.1</jasypt-spring-boot-starter>

  <logbook-spring-boot-starter>1.13.0</logbook-spring-boot-starter>

  0.8.1</assertj-swagger>

  <jacoco-version>0.8.4</jacoco-version>

</properties>

<dependencies>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-actuator</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-jpa</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-data-rest</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-devtools</artifactId>

    <scope>runtime</scope>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-configuration-processor</artifactId>

  </dependency>

  <dependency>

    <groupId>org.projectlombok</groupId>

    lombok</artifactId>

    <optional>true</optional>

  </dependency>

  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-test</artifactId>

    <scope>test</scope>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-spring-web</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-core</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-data-rest</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-bean-validators</artifactId>

    <version>${swagger-springfox.version}</version>

  </dependency>
@Configuration

@EnableSwagger2

public class SwaggerConfiguration {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }

}

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>2.0.0.RELEASE</version>

</dependency>
@Primary

@Bean

public LinkDiscoverers discoverers() {

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

}
  Use following 2 dependency to resolve Swagger and Hateoas dependency conflict.

  

  If Spring Boot version is >= 2.2.0 the use io.springfox version 3.0.0

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>3.0.0</version>

  </dependency>

  

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>3.0.0</version>

  </dependency>
  <dependency>

    <groupId>io.springfox</groupId>

    springfox-boot-starter</artifactId>

    <version>3.0.0</version>

  </dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-dependencies</artifactId>

 <version>2.2.6.RELEASE</version>

 <type>pom</type>

 <scope>import</scope>

</dependency>

.....

.....

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger2</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

 <groupId>io.springfox</groupId>

 springfox-swagger-ui</artifactId>

 <version>2.9.2</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>${spring-plugin.version}</version>

</dependency>

<dependency>

  <groupId>org.springframework.plugin</groupId>

  spring-plugin-core</artifactId>

  <version>1.2.0.RELEASE</version>

</dependency>
@EnableSwagger2

@Configuration

public class SwaggerConfiguration {



  @Primary

  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

  }



  @Bean

  public Docket postsApi() {

    return new Docket(DocumentationType.SWAGGER_2)

        .groupName("{ApplicationName}")

        .apiInfo(buildApiInfo())

        .select()

        .apis(RequestHandlerSelectors.any())

        .paths(PathSelectors.regex("/.*"))

        .build();

  }



  private ApiInfo buildApiInfo() {

    Contact contact = new Contact("CompanyName","https://company-domain.com","mail@company.com");

    return new ApiInfoBuilder()

        .title(""{ApplicationName}"")

        .description("API Description")

        .license("license")

        .version("1.0")

        .contact(contact)

        .licenseUrl("licenseURl")

        .build();

  }

}
  <dependency>

    <groupId>org.springframework.boot</groupId>

    spring-boot-starter-hateoas</artifactId>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger2</artifactId>

    <version>2.9.2</version>

  </dependency>

  <dependency>

    <groupId>io.springfox</groupId>

    springfox-swagger-ui</artifactId>

    <version>2.9.2</version>

  </dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.6.1</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.6.1</version>

</dependency>
Description:



Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration required a single bean, but 3 were found:

  - relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]

  - linkDiscovererRegistry: defined in null

  - entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]





Action:



Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
<dependency>

  <groupId>org.springframework.hateoas</groupId>

  spring-hateoas</artifactId>

  <version>1.1.1.RELEASE</version>

</dependency>
@Bean

public LinkDiscoverers discovers() {  

  List<LinkDiscoverer> plugins = new ArrayList<>();

  plugins.add(new CollectionJsonLinkDiscoverer());

  return new LinkDiscoverers(SimplePluginRegistry.create(plugins));[enter image description here][1] 

}

<properties>

  <spring-plugin-core.version>2.0.0.RELEASE</spring-plugin-core.version>

  <springfox.version>3.0.0</springfox.version>

</properties>



<dependencyManagement>

 <dependencies>

  <!-- API Documentation -->

  <!-- Fix wrong resolved `spring-plugin-core` dependency version for springfox -->

  <dependency>

   <groupId>org.springframework.plugin</groupId>

   spring-plugin-core</artifactId>

   <version>${spring-plugin-core.version}</version>

  </dependency>

  <dependency>

   <groupId>io.springfox</groupId>

   springfox-boot-starter</artifactId>

   <version>${springfox.version}</version>

  </dependency>

 </dependencies>

</dependencyManagement>



<dependencies>

 <!-- API Documentation -->

 <dependency>

  <groupId>io.springfox</groupId>

  springfox-boot-starter</artifactId>

 </dependency>

</dependencies>

<dependency>

  <groupId>com.jayway.jsonpath</groupId>

  json-path</artifactId>

  <scope>test</scope>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>3.0.0</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.8.0</version>

</dependency>

<dependency>

 <groupId>org.springframework.hateoas</groupId>

 spring-hateoas</artifactId>

</dependency>

<dependency>

 <groupId>org.springframework.boot</groupId>

 spring-boot-starter-hateoas</artifactId>

</dependency>

package com.company.springbootworks.swagger;



import java.time.LocalDate;

import java.util.ArrayList;

import java.util.List;



import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.hateoas.client.LinkDiscoverer;

import org.springframework.hateoas.client.LinkDiscoverers;

import org.springframework.hateoas.mediatype.collectionjson.CollectionJsonLinkDiscoverer;

import org.springframework.http.ResponseEntity;

import org.springframework.plugin.core.SimplePluginRegistry;



import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger.web.DocExpansion;

import springfox.documentation.swagger.web.ModelRendering;

import springfox.documentation.swagger.web.OperationsSorter;

import springfox.documentation.swagger.web.TagsSorter;

import springfox.documentation.swagger.web.UiConfiguration;

import springfox.documentation.swagger.web.UiConfigurationBuilder;

import springfox.documentation.swagger2.annotations.EnableSwagger2;



@Configuration

@EnableSwagger2

public class SwaggerConfig {



  @Bean

  public LinkDiscoverers discoverers() {

    List<LinkDiscoverer> plugins = new ArrayList<>();

    plugins.add(new CollectionJsonLinkDiscoverer());

    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));



  }



  @Bean

  public Docket eDesignApi(SwaggerConfigProperties swaggerConfigProperties) {

    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(swaggerConfigProperties))

        .enable(Boolean.valueOf(swaggerConfigProperties.getEnabled())).select()

        .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build().pathMapping("/")

        .directModelSubstitute(LocalDate.class, String.class).genericModelSubstitutes(ResponseEntity.class)

        .useDefaultResponseMessages(Boolean.valueOf(swaggerConfigProperties.getUseDefaultResponseMessages()))

        .enableUrlTemplating(Boolean.valueOf(swaggerConfigProperties.getEnableUrlTemplating()));

  }



  @Bean

  UiConfiguration uiConfig(SwaggerConfigProperties swaggerConfigProperties) {

    return UiConfigurationBuilder.builder().deepLinking(Boolean.valueOf(swaggerConfigProperties.getDeepLinking()))

        .displayOperationId(Boolean.valueOf(swaggerConfigProperties.getDisplayOperationId()))

        .defaultModelsExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelsExpandDepth()))

        .defaultModelExpandDepth(Integer.valueOf(swaggerConfigProperties.getDefaultModelExpandDepth()))

        .defaultModelRendering(ModelRendering.EXAMPLE)

        .displayRequestDuration(Boolean.valueOf(swaggerConfigProperties.getDisplayRequestDuration()))

        .docExpansion(DocExpansion.NONE).filter(Boolean.valueOf(swaggerConfigProperties.getFilter()))

        .maxDisplayedTags(Integer.valueOf(swaggerConfigProperties.getMaxDisplayedTags()))

        .operationsSorter(OperationsSorter.ALPHA)

        .showExtensions(Boolean.valueOf(swaggerConfigProperties.getShowExtensions()))

        .tagsSorter(TagsSorter.ALPHA).supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)

        .validatorUrl(null).build();

  }



  private ApiInfo apiInfo(SwaggerConfigProperties swaggerConfigProperties) {

    return new ApiInfoBuilder().title(swaggerConfigProperties.getTitle())

        .description(swaggerConfigProperties.getDescription()).version(swaggerConfigProperties.getApiVersion())

        .build();

  }

}

<properties>

  <java.version>1.8</java.version>

  <swagger.version>2.9.2</swagger.version>

  <swagger-annotations.version>1.5.21</swagger-annotations.version>

  <swagger-models.version>1.5.21</swagger-models.version>

  <spring-plugin.version>2.0.0.BUILD-SNAPSHOT</spring-plugin.version>

</properties>





<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>${swagger.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-annotations</artifactId>

  <version>${swagger-annotations.version}</version>

</dependency>

<dependency>

  <groupId>io.swagger</groupId>

  swagger-models</artifactId>

  <version>${swagger-models.version}</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger2</artifactId>

  <version>2.4.0</version>

</dependency>



<dependency>

  <groupId>io.springfox</groupId>

  springfox-swagger-ui</artifactId>

  <version>2.4.0</version>

</dependency>
compile group: 'io.springfox', name: 'springfox-swagger-ui', version:'2.9.2' 

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'

对我来说这个链接有帮助:https://github.com/spring-projects/spring-hateoas/issues/731

简而言之,我添加了我的依赖项:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 17: modelBuilderPluginRegistry,modelPropertyBuilderPluginRegistry,typeNameProviderPluginRegistry,syntheticModelProviderPluginRegistry,documentationPluginRegistry,apiListingBuilderPluginRegistry,operationBuilderPluginRegistry,parameterBuilderPluginRegistry,expandedParameterBuilderPluginRegistry,resourceGroupingStrategyRegistry,operationModelsProviderPluginRegistry,defaultsProviderPluginRegistry,pathDecoratorRegistry,apiListingScannerPluginRegistry,relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry





Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'linkDiscoverers' defined in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]: Unsatisfied dependency expressed through method 'linkDiscoverers' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframewor				

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161