首页 > 解决方案 > 非网页 Spring Boot 应用中的 FeignClient 配置

问题描述

我有一个 Spring Boot 应用程序,它作为 Web 应用程序或基于spring.main.web-application-type参数的控制台应用程序运行。

应用程序.java

@EnableFeignClients
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

和 ConsoleApplication.java

@Component
@ConditionalOnNotWebApplication
public class ConsoleApplication implements ApplicationRunner {
    private final SomeFeignClient someFeignClient;

    public ConsoleApplication(SomeFeignClient someFeignClient) {
        this.someFeignClient = someFeignClient;
    }

    @Override
    public void run(ApplicationArguments args) {
        someFeignClient.someMethod(); // This calls feign client method
    }
}

SomeFeignClient.java

@FeignClient(name = "my-api", url = "http://example.com", configuration = MyFeignConfiguration.class)
public interface SomeFeignClient {

    @RequestLine("GET /some/api")
    String someMethod();
}

MyFeignConfiguration.java

// No @Configuration annotation
public class MyFeignConfiguration {
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }

    @Bean
    public DefaultAccessTokenRequest accessTokenRequest() {
        return new DefaultAccessTokenRequest();
    }

    @Bean
    public DefaultOAuth2ClientContext context(AccessTokenRequest accessTokenRequest) {
        return new DefaultOAuth2ClientContext(accessTokenRequest);
    }

    @Bean
    public ClientCredentialsResourceDetails resourceDetails() {
        ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
        resourceDetails.setClientId("CLIENT_ID");
        resourceDetails.setClientSecret("CLIENT_SECRET");
        resourceDetails.setAccessTokenUri("TOKEN_URL");
        resourceDetails.setGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue());
        return resourceDetails;
    }

    @Bean
    public RequestInterceptor feignRequestInterceptor(OAuth2ClientContext context, OAuth2ProtectedResourceDetails details) {
        return new OAuth2FeignRequestInterceptor(context, details);
    }
}

MyFeignConfiguration.java客户端在作为 Web 应用程序 () 运行时工作并获取配置,但在作为控制台应用程序 ( ) 运行并使用默认配置spring.main.web-application-type=SERVLET时不会。spring.main.web-application-type=NONE

我尝试在Spring Cloud OpenFeign 文档Spring Cloud 文档中进行搜索,但找不到任何具体的内容。

有没有人遇到过类似的情况并知道可能是什么原因造成的?

谢谢。

标签: javaspringspring-cloudspring-cloud-feign

解决方案


推荐阅读