将自定义假装客户端注入 Spring 应用程序



我目前正在尝试掌握Spring和Feign。 切中要害: 我正在努力修改这个项目中的@FeignClient: 假装你好世界 by 瓦莱里 以便代替

维基数据客户端

@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:名为:手动创建假客户端的部分

这样做的目的是稍后注入自定义解码器和编码器。我已经用它练习了一段时间,我所能实现的只是毁了整个事情。

我从这里和那里收集了一些线索,并设法创建了一个配置类:

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

并尝试使用上述类

维基数据运行者

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

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

2017-07-19 08:

02:29.056 错误 2018 ---线程"main"中的异常 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件中定义了名称为"wikidataRunner"的 bean 时出错 [/home/mibi/IdeaProjects/FUFEign/feign-helloworld/target/classes/codes/walery/research/feign/wikidata/WikidataRunner.class]: 通过构造函数参数表达的不满意依赖关系 索引 0 的类型为 [codes.walery.research.feign.wikidata.WikidataClient]: :没有合格的豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到 依赖关系:预计至少 1 个符合自动连线条件的 Bean 此依赖项的候选者。依赖关系注释:{};嵌 套 例外情况是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No 合格豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到依赖关系:预计至少 1 个符合自动连线条件的 Bean 此依赖项的候选者。依赖注释: {} [
main] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) o.s.boot.SpringApplication at 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: No 合格豆类型 [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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at 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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] atorg.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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at 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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at 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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at 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) 在 codes.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]:通过构造函数参数表达的不满意依赖关系 索引 0 的类型为 [codes.walery.research.feign.wikidata.WikidataClient]: :没有合格的豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到 依赖关系:预计至少 1 个符合自动连线条件的 Bean 此依赖项的候选者。依赖关系注释:{};嵌 套 例外情况是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No 合格豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到 依赖关系:预期至少为 1 个由以下原因引起: org.springframework.beans.factory.NoSuchBeanDefinitionException: No 合格豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到 依赖关系:预计至少 1 个符合自动连线条件的 Bean 此依赖项的候选者。依赖关系注释:{} atorg.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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at 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) ~[春豆-4.2.1.发布.jar:4.2.1.发布] atorg.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) ~[春豆-4.2.1.发布.jar:4.2.1.发布] ...18 更多在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[春豆-4.2.1.发布.jar:4.2.1.发布] atorg.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[春豆-4.2.1.发布.jar:4.2.1.发布] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) ~[spring-context-4.2.1.RELEASE.jar:4.2.1.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:667) [弹簧启动-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.doRun(SpringApplication.java:342) [弹簧启动-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:273) [弹簧启动-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:980) [弹簧启动-1.3.0.M5.jar:1.3.0.M5] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:969) [弹簧启动-1.3.0.M5.jar:1.3.0.M5] 在 codes.walery.research.feign.FeignHelloworldApplication.main(FeignHelloworldApplication.java:12) [类/:NA] 2017-07-19 08:02:29.059 信息 2018 --- [ 线程-1]s.c.a.AnnotationConfigApplicationContext : Closed org.springframework.context.annotation.AnnotationConfigApplicationContext@3d8314f0: 启动日期 [2017 年 7 月 19 日星期三 08:02:24 CEST ];上下文的根源 等级制度

进程已完成,退出代码为 1

我不会否认自己是春季和假装的新手。问题是我需要拼命地消除这两个。到目前为止,我已经花了10 +个小时研究Feign无济于事。

恳请帮助和指导

缺少支架

org.springframework.beans.factory.NoSuchBeanDefinitionException: No 合格豆类型 [codes.walery.research.feign.wikidata.WikidataClient] 找到 依赖关系:预计至少 1 个符合自动连线条件的 Bean 此依赖项的候选者。

尝试在某处声明一个 bean:

@Bean
public WikiDataClient wikiDataClient () {
}

使用伪装构建器手动构建假客户端:

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

最新更新