【问题标题】:Inject custom feign client into Spring Application将自定义 feign 客户端注入 Spring Application
【发布时间】:2017-12-23 16:56:37
【问题描述】:

我目前正在尝试同时掌握 Spring 和 Feign。 切入正题: 我正在努力修改这个项目中的@FeignClient: Feign Hello World by Walery 以代替

维基数据客户端

@FeignClient(url = "https://www.wikidata.org/w")
// https://www.wikidata.org/w/api.php?action=wbsearchentities&search=apple&language=en&format=json
public interface WikidataClient {

    @RequestMapping(value = "/api.php?action=wbsearchentities&language=en&format=json", method = GET)
    WebsearchEntities searchForEntities(@RequestParam("search") final String search);
}

使用类似于此处找到的@Autowired 表示法:Section called : Creating Feign Clients Manually

这样做的目的是稍后注入自定义解码器和编码器。我已经用它进行了一段时间的实验,但我设法实现的只是毁掉了整个事情。

我从这里和那里收集了一些线索,并设法达到了我创建配置类的地步:

FeignConfig

@Import(FeignClientsConfiguration.class)
public class FeignConfig {
    public WikidataClient fooclient;
    @Autowired
    public FeignConfig(Encoder encoder, Decoder decoder){
        this.fooclient = Feign.builder()
                .encoder(encoder)
                .decoder(decoder)
                .target(WikidataClient.class,"https://www.wikidata.org/w");
    }
}

修改

维基数据客户端

界面略

//@FeignClient(url = "https://www.wikidata.org/w")
// https://www.wikidata.org/w/api.php?action=wbsearchentities&search=apple&language=en&format=json
public interface WikidataClient {

    @RequestMapping(value = "/api.php?action=wbsearchentities&language=en&format=json", method = GET)
    WebsearchEntities searchForEntities(@RequestParam("search") final String search);
}

并尝试改用上述类

WikidataRunner

@Component
public class WikidataRunner implements CommandLineRunner {
    private final WikidataClient omdbClient;
    @Autowired
    public WikidataRunner(WikidataClient omdbClient){
        this.omdbClient = omdbClient;
        this.feignConfig = new FeignConfig(new Encoder.Default(), new Decoder.Default());
    }

    FeignConfig feignConfig;
    @Override
    public void run(final String... args) throws Exception {
        final WebsearchEntities apple = feignConfig.fooclient.searchForEntities("apple");
        System.out.println(apple);
    }
}

我得到的只是不同类型的 Bean 错误

2017-07-19 08:02:29.056 错误 2018 --- 线程“主”中的异常 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件中定义的名称为“wikidataRunner”的 bean 时出错 [/home/mibi/IdeaProjects/FUFEign/feign-helloworld/target/classes/codes/walery/research/feign/wikidata/WikidataRunner.class]: 通过构造函数参数表达的不满足的依赖关系 [codes.walery.research.feign.wikidata.WikidataClient] 类型的索引 0: : 没有符合条件的 bean 类型 [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解:{};嵌套的 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 类型的限定 bean [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解:{} [
主要]在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) os.boot.SpringApplication 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) : 应用程序启动失败 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 类型的限定 bean [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解:{} at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1072) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:967) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:667) 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.boot.SpringApplication.doRun(SpringApplication.java:342) ... 18 个常用框架省略 org.springframework.boot.SpringApplication.run(SpringApplication.java:273) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:980) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:969) 在 代码.walery.research.feign.FeignHelloworldApplication.main(FeignHelloworldApplication.java:12) 包裹者: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件中定义的名称为“wikidataRunner”的 bean 时出错 [/home/mibi/IdeaProjects/FUFEign/feign-helloworld/target/classes/codes/walery/research/feign/wikidata/WikidataRunner.class]: 通过构造函数参数表达的不满足的依赖关系 [codes.walery.research.feign.wikidata.WikidataClient] 类型的索引 0: : 没有符合条件的 bean 类型 [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解:{};嵌套的 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 类型的限定 bean [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少 1 个原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 类型的限定 bean [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解:{} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326) 有资格作为此依赖项的自动装配候选者。 依赖注解:{} at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1072) 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:967) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] ... 18 更多 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834) ~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) ~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:667) [spring-boot-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.doRun(SpringApplication.java:342) [spring-boot-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:273) [spring-boot-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:980) [spring-boot-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:969) [spring-boot-1.3.0.M5.jar:1.3.0.M5] 在 代码.walery.research.feign.FeignHelloworldApplication.main(FeignHelloworldApplication.java:12) [classes/:na] 2017-07-19 08:02:29.059 INFO 2018 --- [Thread-1] s.c.a.AnnotationConfigApplicationContext :关闭 org.springframework.context.annotation.AnnotationConfigApplicationContext@3d8314f0: 启动日期 [Wed Jul 19 08:02:24 CEST 2017];语境之根 层次结构

进程以退出代码 1 结束

我不会否认自己是 Spring and Feign 的新手。事情是我需要拼命地理解这两个。到目前为止,我已经花了 10 多个小时研究 Feign,但无济于事。

请寻求帮助和指导

缺少括号

【问题讨论】:

  • 我们需要知道那些“不同”类型的错误是什么;我们无法读懂您的想法并解决您未描述的问题。
  • 已编辑。上面发布了一个或“加载应用程序上下文失败”

标签: java spring feign


【解决方案1】:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 符合条件的 bean 类型 [codes.walery.research.feign.wikidata.WikidataClient] 为 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选者。

尝试在某处声明一个 bean:

    @Bean
    public WikiDataClient wikiDataClient () {

    }

使用 feign builder 手动构建 feign 客户端:

Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract).target(WikiDataClient.class, "http://serviceId")

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 2018-02-12
    • 2019-01-20
    • 2018-04-19
    • 2019-11-12
    • 2021-06-12
    • 2019-07-27
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多