首页 文章

将自定义假装客户端注入Spring Application

提问于
浏览
0

我目前正试图 grab Spring和Feign . 直截了当:我正在努力修改这个项目中的@FeignClient:Feign Hello World by Walery以便代替

WikidataClient

@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

这样做的目的是稍后注入自定义解码器和编码器 . 我已经对它进行了一段时间的实践,而我所能实现的只是破坏了整个事情 .

我从这里和那里收集了一些线索,并设法达到我创建Configuration类的程度:

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

改性

WikidataClient

界面略

//@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 ERROR 2018 ---线程“main”中的异常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]的索引0 ::没有找到[codes.walery.research.feign.wikidata.WikidataClient]类型的限定bean用于依赖:预期至少有1个bean可以作为此依赖项的autowire候选者 . 依赖注释:{};嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[codes.walery.research.feign.wikidata.WikidataClient]的限定bean依赖:预期至少有1个bean符合此依赖关系的autowire候选者 . 依赖注释:{} [main] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)osboot.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:找不到类型为[codes.walery.research.feign.wikidata.WikidataClient]的限定bean依赖:预期至少有1个bean符合此依赖关系的autowire候选者 . 依赖注释:{} atg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)at org . orframe.springframework.beans.factory.support.AbstractBeanFactory上的springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326)~ [spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] $ 1.getObject(AbstractBeanFactory.java:305)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)at 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)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:967)~ [spring- bean-4.2.1.RELEASE.jar:4.2.1.RELEASE]在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization上的org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) AbstractApplicationContext.java:834)org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813)〜[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] at org . springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)atOrg.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)... org.springframework.boot.SpringApplication.run(SpringApplication.java:273)在org中省略了18个常见框架.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]:通过构造表达的不满意的依赖性或类型为[codes.walery.research.feign.wikidata.WikidataClient]的索引为0的参数::没有找到依赖的[codes.walery.research.feign.wikidata.WikidataClient]类型的限定bean:期望至少有1个bean有资格作为此依赖项的autowire候选者 . 依赖注释:{};嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[codes.walery.research.feign.wikidata.WikidataClient]的限定bean用于依赖:预期至少有1个beCaused:org.springframework.beans.factory . NoSuchBeanDefinitionException:找不到类型为[codes.walery.research.feign.wikidata.WikidataClient]的限定bean依赖:预期至少有1个bean符合此依赖关系的autowire候选者 . 依赖注释:{} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326),它有资格作为此依赖项的autowire候选者 . 依赖注释:{} atg.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1072)at 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.ConstructorResolver上的org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:967) .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] ...在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)〜[spring-beans-4.2 . 1.RELEASE.jar:4.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)~ [spring-beans-4.2.1.RELEASE.jar:4.2.1 .RELEASE] org.springframework.beans上的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)〜[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] .factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:305)〜[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE] at 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.AbstractBean org.springframework.beans.factory.support.AbstractBeanFactory.getBean中的Factory.doGetBean(AbstractBeanFactory.java:301)〜[spring-beans-4.2.1.RELEASE.jar:4.2.1.RELEASE](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] atorg.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] at 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]在codes.walery.research.feign.FeignHelloworldApplication.main(FeignHelloworldApp) lication.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无济于事 .

请寻求帮助和指导

MissingBracket

1 回答

  • 0

    您的代码有几个问题,一个是直接致命的,另一个是代码味道 . 如果你声称自己是以Spring为起点,那么IMO就会过度热衷于Spring Cloud . 你需要很多帮助 .

    我在GitHub上使用Feign客户端完成了一个完整的应用程序 . 它也使用Hystrix,但您可以忽略它以达到您的目的 . 我打算写一篇关于它的博客文章,只是还没有这样做 . 我的Eureka blog post是关于Netflix Eureka在互联网上最受欢迎的资源之一 .

    • 您不应该将URL放在Feign客户端中;假冒客户端是一种抽象 . 您可以为其命名并在其他位置配置属性 . [代码味道]

    • 您不应该在Feign客户端中对查询参数进行硬编码 . [代码味道]

    • 你不需要 Feign.builder() ; Spring将为您自动配置一个 . 如果使用注释或Feign配置配置_1178263,则只需要它 . [我不确定这种行为]

    • 你需要_1478264_ for Spring来接收客户端,假设它与 CommandLineRunner 的子程序包相同或者是其中一个 . 就像你承认的那样,你显然不会让它成为 @Component . 阅读如何实施 CommandLineRunner . [致命]

    看看我的示例应用 . 顺便说一下,10个小时什么都不是;我已经使用Spring Cloud工作了1 . 5年,我仍然不知道所有这些 .

相关问题