0

我目前正在尝试同时掌握 Spring 和 Feign。直截了当:我正在努力修改这个项目中的@FeignClient: Walery的Feign Hello World, 以便代替

维基数据客户端

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

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

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

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 中的异常:创建文件 [/home/mibi/IdeaProjects/ 中定义的名称为“wikidataRunner”的 bean 时出错FUFEign/feign-helloworld/target/classes/codes/walery/research/feign/wikidata/WikidataRunner.class]:通过构造函数参数表示的不满足的依赖关系,类型为[codes.walery.research.feign.wikidata.WikidataClient]: :没有为依赖找到类型 [codes.walery.research.feign.wikidata.WikidataClient] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖的自动装配候选者。依赖注解:{}; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [codes.walery.research.feign. wikidata.WikidataClient] 找到依赖项:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{} [
预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注释:{} at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org. springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326) ~[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $1.getObject(AbstractBeanFactory.java:305) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org. springframework.boot.SpringApplication.run(SpringApplication.java:969) at codes.walery.research.feign.FeignHelloworldApplication.main(FeignHelloworldApplication.java:12) 包装:org.springframework.beans.factory.UnsatisfiedDependencyException:创建 bean 时出错在文件 [/home/mibi/IdeaProjects/FUFEign/feign-helloworld/target/classes/codes/walery/research/feign/wikidata/WikidataRunner.class] 中定义的名称“wikidataRunner”:通过索引为 0 的构造函数参数表示的不满足的依赖关系类型 [codes.walery.research.feign.wikidata.WikidataClient]: : 找不到类型为 [codes.walery.research.feign.wikidata.WikidataClient] 的合格 bean 依赖项:预计至少有 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 有资格作为此依赖项的自动装配候选者。依赖项注释: org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326) 中的 {} 有资格作为此依赖项的自动装配候选者。依赖注释:{} at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory. FeignHelloworldApplication.main(FeignHelloworldApplication.java:12) [classes/:na] 2017-07-19 08:02:29.059 INFO 2018 --- [Thread-1] scaAnnotationConfigApplicationContext:关闭 org.springframework.context.annotation.AnnotationConfigApplicationContext@3d8314f0 : 启动日期 [Wed Jul 19 08:02:24 CEST 2017]; 上下文层次的根

进程以退出代码 1 结束

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

请寻求帮助和指导

缺少括号

4

1 回答 1

0

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")
于 2021-11-19T10:06:11.473 回答