Spring Boot Openfeign +Spring云:字段需要的Bean类型找不到

nqwrtyyt  于 2022-11-05  发布在  Spring
关注(0)|答案(3)|浏览(180)

我有一个问题,Spring和开放的,我想你可以帮助我。
我有一个pom文件如下:

<?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>

    <groupId>xx.yyy</groupId>
    <artifactId>component</artifactId>
    <version>1.0.0</version>
    <name>component</name>

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <pact.version>3.6.7</pact.version>
        <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath />
    </parent>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
......
<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>
......

我已经在主类中声明了以下配置:

@SpringBootApplication(scanBasePackages = {"xx.yyy", "xx.yyy.rest.client"}, exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableAsync
@Import({P2OrchestratorApplicationConfig.class})
public class P2OrchestratorApplication {

    public static void main(String[] args) {
        SpringApplication.run(P2OrchestratorApplication.class, args);
    }
}

我有一个自定义的伪装配置类:

@Configuration
@EnableFeignClients()
@ImportAutoConfiguration({FeignAutoConfiguration.class})
public class FeignConfig {

    @Bean
    public OkHttpClient client() {
        return new OkHttpClient();
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }
}

我有一个公开假客户机如下:

@FeignClient(name="legacyClient", value = "legacyClient", url = "${uri.microservice.legacy}", configuration = FeignConfig.class)
public interface LegacyClient {

    @PatchMapping(value = "/legacy/xxx/cleanLine/{authorizationCode}", produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<Boolean> cleanLine(@PathVariable("authorizationCode") Long authorizationCode, @RequestParam(required = true) Long lineNumber);

}

最后是一个组件,我需要在其中使用此客户端:

@Log4j
@Component("p2ProcessAlgorithm")
public class P2ProcessAlgorithm {

@Autowired
@Qualifier("legacyClient")
private LegacyClient legacyClient;

public final void process(){

Long authorizationCode = 123L;
Long lineNumber = 1L;
Boolean isClean= this.legacClient.cleanLine(authorizationCode, lineNumber);
......
}

但应用程序给予我下一条消息:


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

APPLICATION FAILED TO START

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

Description:

Field legacyClient in xxx.yyy.p2.structure.P2ProcessAlgorithm required a bean of type 'xxx.yyy.rest.client.LegacyClient' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
    - @org.springframework.beans.factory.annotation.Qualifier(value=p2AsyncOrchestratorService)

Action:

Consider defining a bean of type 'xxx.yyy.rest.client.LegacyClient' in your configuration.

我已经尝试了几种配置,但是我无法使openfeign客户端成为P2ProcessAlgorithm类中的可识别bean。
你有什么想法吗?
先谢谢你

yqlxgs2m

yqlxgs2m1#

以下几点可能会有所帮助:
首先:为什么要使用限定符将LegacyClient bean注入到服务中?有很多吗?一般来说,接口应该 Package 到代理中,并作为单个bean放入应用程序上下文中,因此在我的理解中,这里不需要限定符。
另一个问题是:
看起来@FeignClient注解未被处理。因此未创建代理。为了检查这一点,请在配置FeignConfig some of beans / create no-op构造函数中放置断点,并检查它是否被调用(或者可能放置日志消息以查看它是否正常工作)。
您还没有发布软件包结构,但可能是软件包扫描机制没有找到此配置,因此没有创建。

ocebsuys

ocebsuys2#

首先谢谢你回信。
我回答了你的第一个问题,是的,这只是一个习惯。我可以消除它,没有问题。没有更多的Bean占用相同的接口。这不是一个问题。
对于你的第二条评论,你是完全正确的。
在FeignConfig配置类中添加一个构建器,添加一个日志和一个断点,不要停在那里。
附带一个SS随包结构,看看能不能帮我检测出我的问题。
project package structure

  • 在ms.config包中,我有FeignConfig配置类
  • 在rest.client包中,我有所有的接口
  • 在ms包中,主类的符号为SpringBootApplication
  • 在ms.p2.structure包中,是调用伪客户端的类。

非常感谢你提前。

d4so4syb

d4so4syb3#

@SpringBootApplication

@EnableFeignClients

public class Application {
    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);
    }

}

相关问题