Skip to main content

Introduction

Spring 6 now supports creating HTTP clients using the @HttpExchange annotation. This removes the need for Spring Cloud OpenFeign.

Here is an example:

@HttpExchange("https://my-json-server.typicode.com")
interface PostApi {
@GetExchange("/typicode/demo/posts/{id}")
Post getPost(@PathVariable("id") int id);
}

@SpringBootApplication
public class App {

public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

@Bean
PostApi postApi(RestClient.Builder builder) {
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builderFor(RestClientAdapter.create(builder.build()))
.build();
return factory.createClient(PostApi.class);
}

// Imagine there are 100 HttpExchange clients 😇

@Bean
ApplicationRunner runner(PostApi api) {
return args -> api.getPost(1);
}
}

Identified Issues​

  • Lack of Autoconfiguration

    Currently, autoconfiguration is not available for clients, requiring manual instantiation through client beans. This process can become particularly cumbersome when managing numerous clients.

    For users familiar with Spring Cloud OpenFeign, the @EnableFeignClients annotation is highly beneficial, significantly reducing repetitive code.

Quick Start​

// swap to spring-boot-starter-webclient if you use WebClient
implementation("org.springframework.boot:spring-boot-starter-restclient")
implementation("io.github.danielliu1123:httpexchange-spring-boot-starter:<latest>")
@HttpExchange("https://my-json-server.typicode.com")
interface PostApi {
@GetExchange("/typicode/demo/posts/{id}")
Post getPost(@PathVariable("id") int id);
}

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

@Bean
ApplicationRunner runner(PostApi api) {
return args -> api.getPost(1);
}
}
success

No more boilerplate code! 🎉