স্প্রিং বুট ২.২.০ স্প্রিং হেটোয়াস স্টার্টআপ ইস্যু


12

আমি আমার প্রকল্পটি বসন্ত বুট ২.১.৯ থেকে ২.২.০ এ স্থানান্তরিত করেছি। প্রকল্পটি শুরু করার সময় নীচের errorবার্তাগুলির মুখোমুখি হচ্ছি।

কি কারণ হতে পারে, 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]

Pom,

<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>
    <assertj-swagger>0.8.1</assertj-swagger>
    <jacoco-version>0.8.4</jacoco-version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-spring-web</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-core</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-data-rest</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-bean-validators</artifactId>
        <version>${swagger-springfox.version}</version>
    </dependency>

নির্ভরতাতে mvn dependency:treeঅন্য কোনও কিছু টানছে কিনা তা ব্যবহার করে দেখুন Hateoas। আইআরসি আপনি যদি স্প্রিং ডেটা রিস্ট ব্যবহার করেন তবে স্প্রিং হেটোয়াসের উপর নির্ভরতা রয়েছে।
এম। ডিনুম

আমি আপগ্রেড এ একই সমস্যা আছে। নির্ভরতা কোথা থেকে আসছে তা আমি জানি তবে আমি কোনও সমাধান খুঁজে পাইনি।
mkeathley

আপনি কি আমাকে এখানে গাইড করতে পারেন: stackoverflow.com/questions/60001241/… ?
অ্যাশ_১১

উত্তর:


13

Swagger + HATEOASআমার spring-bootআবেদনটিতে আমার এই সমস্যাটি ছিল ।

সমাধানটি নীচে দেওয়া হয়েছে (আপনার সোয়াগার কনফিগারেশন ক্লাসটি সম্পাদনা করুন):

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public LinkDiscoverers discoverers() {
        List<LinkDiscoverer> plugins = new ArrayList<>();
        plugins.add(new CollectionJsonLinkDiscoverer());
        return new LinkDiscoverers(SimplePluginRegistry.create(plugins));

    }
}

_linksরূপান্তরিত হয়েছে linksএবং প্রতিক্রিয়ায় _embeddedরূপান্তরিত contentহয়েছে এটি আমার পক্ষে কাজ করবে বলে মনে হচ্ছে না , সুতরাং আমার বেশিরভাগ এমভিসিমক পরীক্ষাগুলি পরীক্ষা করে _linksব্যর্থ হচ্ছে এবং স্প্রিং-বুট-স্টার্টার- এর সাথে বক্সের বাইরে যে সরবরাহ করা হয়েছে তার থেকে API আলাদা হয়- نفرتগুলি
কেরুবা

আমারও এটা হয়েছিল আপনাকে হাল + জসন সক্ষম করতে হবে
লেবুর

লেবু আপনি কিছুটা ব্যাখ্যা করতে পারেন দয়া করে? আমি কৌতুকটি না করার HalLinkDiscovererপরিবর্তে ক্লাসটি ব্যবহার করার চেষ্টা করেছি CollectionJsonLinkDiscovererএবং এখনও আমার পরীক্ষাগুলি ব্যর্থ হয়েছে কারণ লিঙ্কগুলি যেমন হিসাবে প্রকাশিত হয় linksএবং না হয় _links, তেমন content_embedded
সামগ্রীও

আমার কনফিগারেশন জাভা ফাইলটিতে আমি যেভাবে এটি করেছি তা @EnableHypermediaSupport(type=EnableHypermediaSupport.HypermediaType.HAL)আপনাকে অবশ্যই অন্তর্ভুক্ত করতে হবে org.springframework.hateoas.config.EnableHypermediaSupport। এটি গুরুত্বপূর্ণ কিনা তা নিশ্চিত না তবে আমার নির্ভরতা হিসাবে রয়েছে: বসন্ত-বুট-স্টার্টার-হিটোটোয়াস
লেবু

@ লেমন ভাল উত্তর !! এই বসন্ত-বুট জন্য কাজ করে 2.3.0 + + hateoas + + Swagger থেকে 2.9.2
Anish বি

2

সবচেয়ে ভালো সমাধান

SwaggerConfig শ্রেণিতে কোডের নীচে যুক্ত করুন

@Bean
public LinkDiscoverers discovers() {    
    List<LinkDiscoverer> plugins = new ArrayList<>();
    plugins.add(new CollectionJsonLinkDiscoverer());
    return new LinkDiscoverers(SimplePluginRegistry.create(plugins));[enter image description here][1]  
} 

2

আমার জন্য এই লিঙ্কটি সহায়তা করেছে: https://github.com/spring-projects/spring-hateoas/issues/731

সংক্ষেপে আমি আমার নির্ভরতাগুলিতে যুক্ত করেছি:

<dependency>
    <groupId>org.springframework.plugin</groupId>
    <artifactId>spring-plugin-core</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

ধন্যবাদ! এটি আমার পক্ষে কাজ করেছে। এছাড়াও, এই টিউটোরিয়ালে, সেই নির্ভরতার জন্য একটি রেফারেন্স রয়েছে: baeldung.com/spring-hateoas-tutorial
neojal

1

এই সংস্করণটি 2.6.1 ব্যবহার করে দেখুন, আমি ইতিমধ্যে এইভাবে সমাধান করব solve

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.6.1</version>
</dependency>

1
এটি আমার জন্যও কিছু পরিবর্তন করেনি।
রাউগউ

: আপনি দয়া করে আমাকে এখানে গাইড গেল stackoverflow.com/questions/60001241/...
Ash_P

1

আমি ব্যবহার করার সময় সমস্যাটি আমার মুখোমুখি হয়েছিল

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-dependencies</artifactId>
   <version>2.2.6.RELEASE</version>
   <type>pom</type>
   <scope>import</scope>
</dependency>
.....
.....
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

স্প্রিংফক্স swagger সঙ্গে

<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger2</artifactId>
  <version>2.9.2</version>
</dependency>
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger-ui</artifactId>
  <version>2.9.2</version>
</dependency>

আপনি যদি বসন্তের হেফটোয়াস নির্ভরতাগুলি একবার দেখে নেন তবে spring-plugin-coreসংস্করণটির সাথে নির্ভরতা রয়েছে2.0.0.RELEASE

<dependency>
    <groupId>org.springframework.plugin</groupId>
    <artifactId>spring-plugin-core</artifactId>
    <version>${spring-plugin.version}</version>
</dependency> 

তবে spring-plugin-coreভার্সন সহ সোয়াগার নির্ভরতা ব্যবহার 1.2.0.RELEASE

সিম তৈরির সাথে বসন্ত-বুটের দ্বন্দ্ব রয়েছে তাই org.springframework.pluginবসন্তকে এটি দেখতে আপনার সংস্করণটি একীকরণ করা দরকার , আপনি যদি চয়ন করেন 2.0.0.RELEASEসোয়াগার সংকলন করতে সক্ষম হবে,

সুতরাং সংস্করণ 1.2.0.RELEASEউভয় নির্ভরতা, যেমন মত কাজ করবে

 <dependency>
    <groupId>org.springframework.plugin</groupId>
    <artifactId>spring-plugin-core</artifactId>
    <version>1.2.0.RELEASE</version>
</dependency> 

এর পরে swaggerএবং এর জন্য মটরশুটি শুরু করতে আপনার কনফিগারেশন ক্লাসের প্রয়োজন hateoas:


@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();
    }
}

0

সুতরাং আমি আসলে হিটটোয়াস সমর্থন চেয়েছিলাম এবং একই সমস্যা ছিল। যদি আপনার কাছে থাকে তবে তা ঘটবে

<dependency>
  <groupId>org.springframework.hateoas</groupId>
  <artifactId>spring-hateoas</artifactId>
</dependency>

পরিবর্তে

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

2
এছাড়াও এখানে উল্লেখ করতে চাই যে হেটেস্টোয়াস + সোয়াগার + স্প্রিং বুট ২.২.০ এর সাথে একটি বর্তমান বেমানানতা রয়েছে। আপনি হেফোটোয়াস বা সোয়াগার চালাতে পারেন তবে দুটোই নয়। github.com/springfox/springfox/issues/2932
mkeathley

হিট্টোয়াস ব্যবহার করছি না, এবং এটির দরকারও নেই। এমনকি স্প্রিং ওয়েব স্টার্টার থেকে হেফটোয়াস নির্ভরতা বাদ দেওয়ার চেষ্টা করেছি।
ভায়ান ঝিঙ্গাদে

0

আপনি যদি চান Swaggerতবে HATEOASএটির সাথে আপস করতে পারেন তবে কেবলমাত্র HATEOAS নির্ভরতা অপসারণ করুন এবং যুক্ত করুন:

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

0

এটি সমাধান হয়েছে, এটি যখন সংবর্ধনের কারণে ঘটছিল যখন সোয়াগার + হেটোয়াস স্প্রিং বুট ২.২.৪ ব্যবহার করা হয়েছিল

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();
    }
}

এবং নীচে swagger নির্ভরতা হয়

<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>
    <artifactId>springfox-swagger2</artifactId>
    <version>${swagger.version}</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>${swagger.version}</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>${swagger-annotations.version}</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-models</artifactId>
    <version>${swagger-models.version}</version>
</dependency>

কোথা থেকে আপনি সোয়াগারকনফিগপ্রপার্টিগুলি পাচ্ছেন?
rajadilipkolli

0

আমি এই নির্ভরতাগুলি একটি কার্যকরী এবং কাজ হিসাবে সরিয়েছি:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.4.0</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.4.0</version>
</dependency>

আপনার জন্য কাজ করে যদি আমাকে জানাবেন।


0

স্প্রিং বুট সংস্করণ 2.1.3.RELEASEব্যবহারকারীদের জন্য, নীচের নির্ভরতা হেফটোয়াস + সোয়াগারের জন্য দুর্দান্ত কাজ করে:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.