【问题标题】:Unable to import @HystrixCommand无法导入@HystrixCommand
【发布时间】:2022-01-27 00:54:00
【问题描述】:

我正在学习微服务。因此,为了确保容错,我想使用 hystrix。 我将 springboot 与 maven 一起用于此实现。我按照教程进行了实现,并尝试在 pom.xml 中添加各种依赖项。然而它并不成功。无法导入 @HystrixCommand 以供使用。我附上了下面显示的示例错误。我的微服务应用代码如下所示。

我的 Pom.XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.javabrains</groupId>
    <artifactId>movie-catalog-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>movie-catalog-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>

    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>16</source>
                    <target>16</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

主要方法

    package io.javabrains.moviecatalogservice;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.context.annotation.Bean;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    import org.springframework.web.reactive.function.client.WebClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableHystrix
    public class MovieCatalogServiceApplication {
    
    
        @Bean
        @LoadBalanced 
        public RestTemplate getRestTemplate() {
    
            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
            clientHttpRequestFactory.setConnectTimeout(3000);
            return new RestTemplate(clientHttpRequestFactory);
        }
    
    
    
        public static void main(String[] args) {
            SpringApplication.run(MovieCatalogServiceApplication.class, args);
        }
    
    }

The controller/ resource class
package io.javabrains.moviecatalogservice.resources;

import com.netflix.discovery.DiscoveryClient;

import io.javabrains.moviecatalogservice.models.CatalogItem;
import io.javabrains.moviecatalogservice.models.Movie;
import io.javabrains.moviecatalogservice.models.Rating;
import io.javabrains.moviecatalogservice.models.UserRating;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

//How to make it REST... Just add the annotation
//So whenever a request is made, it checks the controller for any action to be done
@RestController

//Further to say springboot to treat this as api which is accessible at /catalog/something
@RequestMapping("/catalog")
public class MovieCatalogResource {

    @Autowired //I am basically telling spring that somebody has a BEAN  somewhere, offsitre restTempltae//GET ME THT THING
    private RestTemplate restTemplate;
//
//    @Autowired
//    private DiscoveryClient client;
    
    //FOR WEB CLIENT
    @Autowired
    private WebClient.Builder webClientBuilder;


    @RequestMapping("/{userId}") //userId is a variable and it will passed
    @HystrixCommand(fallbackMethod = "getFallBackCatalog")//teliing hsyutrix that getCatalog shouldnt brak the limit. If it breaks, call getFallBackCatalog
    public List<CatalogItem> getCatalog(@PathVariable("userId") String userId){

        UserRating ratings = restTemplate.getForObject("http://RATING-DATA-SERVICE/ratingsdata/user/" + userId, UserRating.class);

        return ratings.getRatings().stream().map(rating -> {
          
            System.out.println(rating.getMovieId());
            Movie movie = restTemplate.getForObject("http://MOVIE-INFO-SERVICE/movies/"+rating.getMovieId(), Movie.class);
                return new CatalogItem(movie.getName() , "Test", rating.getRating());
       



            })
                .collect(Collectors.toList());
    


    }

   public List<CatalogItem> getFallBackCatalog(@PathVariable("userId") String userId){
      return Arrays.asList(new CatalogItem("No movie", "", 0));//returning default list
    }
}

但是,我遇到的问题是我无法导入 @HystrixCommand,因为它没有被识别

【问题讨论】:

  • 尝试运行 ./mvnw clean 并再次重新导入您的依赖项。
  • 乍一看,似乎是 IDE 的缓存问题。您是否尝试从命令提示符进行 maven 构建?试一试,看看您是否能够重现该错误。在 POM.xml 文件目录中运行此命令:./mvn clean build

标签: spring microservices hystrix


【解决方案1】:

在此依赖项中添加版本。就这样

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
      <version>1.4.7.RELEASE</version>
</dependency>

【讨论】:

    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2021-11-20
    • 2017-08-06
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多