如何在不使用 Spring Boot 的情况下注入 Feign Client 并调用 REST Endpoint

Posted

技术标签:

【中文标题】如何在不使用 Spring Boot 的情况下注入 Feign Client 并调用 REST Endpoint【英文标题】:How to inject Feign Client with out using Spring Boot and call a REST Endpoint 【发布时间】:2019-11-08 09:45:05 【问题描述】:

我有两个 Java 进程——它们使用不同的运行配置从同一个 Jar 中生成

流程 A - 客户端 UI 组件,使用基于 Spring bean xml 的方法开发。没有 Spring Boot。

流程 B - 基于 Springboot 的新组件,托管 REST 端点。

现在从 Process A ,在各种按钮上单击如何使用 Feign Client 在 Process B 上调用 REST 端点。

注意 - 由于 Process A 是基于 Spring XML 的,目前我们无法将其转换为 Spring boot。因此,@EnableFeignClients 不能用于初始化 Feign 客户端

两个问题

1) 如果以上是可能的怎么办?

2) 直到进程 A 移至 Spring boot - Feign 仍然比 spring REST 模板更容易选择吗?

【问题讨论】:

【参考方案1】:

您可以在任何代码中初始化 Feign(没有 spring),就像在自述文件示例中一样:

public static void main(String... args) 
    GitHub github = Feign.builder()
                     .decoder(new GsonDecoder())
                     .target(GitHub.class, "https://api.github.com");
...

请查看入门指南:feign on github

【讨论】:

【参考方案2】:

Feign 是受 Retrofit、JAXRS-2.0 和 WebSockets 启发的 Java 到 HTTP 客户端绑定器,您可以在没有 spring boot 的情况下轻松使用 feign。是的,使用 feign 仍然是更好的选择,因为 Feign 使用声明性方式简化 HTTP API 客户端,就像 Spring REST 所做的那样。

1) 在接口中定义http方法和端点。

@Headers("Content-Type: application/json")
public interface NotificationClient 

    @RequestLine("POST")
    String notify(URI uri, @HeaderMap Map<String, Object> headers, NotificationBody body);

2) 使用Feign.builder()方法创建Feign客户端。

Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(customDecoder())
                .target(Target.EmptyTarget.create(NotificationClient.class));

feign 中有多种decoders 可用于简化您的任务。

【讨论】:

@AnirbanBanerjee 如果它对您有用,可以接受答案,这将帮助其他人找到相关问题的解决方案。

以上是关于如何在不使用 Spring Boot 的情况下注入 Feign Client 并调用 REST Endpoint的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?

如何在不依赖 MongoDB 的情况下启动 spring-boot 应用程序?

如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API

如何在不启动 HikariPool 关闭的情况下使用 Hikari 数据源运行 Spring Boot 应用程序

如何使用 Java Spring Boot 在不插入新值的情况下更新表中的现有值