Introduction
This page describes how CXF JAX-RS Client code can be used inside SpringBoot applications.
Please see a CXF JAX-RS starter section on how to enable JAX-RS endpoints.
Setup
If your SpringBoot Application depends on a CXF JAX-RS starter then no more dependencies are required.
If you'd like to run JAX-RS clients in a pure client-side SpringBoot Application then the following Maven pom should suffice in many cases:
<? xml version = "1.0" encoding = "UTF-8" ?>
< modelVersion >4.0.0</ modelVersion >
< parent >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-parent</ artifactId >
< version >1.4.5.RELEASE</ version >
</ parent >
< artifactId >spring-boot-cxf-client-application</ artifactId >
< groupId >org.apache.cxf.samples</ groupId >
< version >3.1.11</ version >
< name >Spring Boot CXF Client Application</ name >
< description >Spring Boot CXF Client Application</ description >
< properties >
< cxf.version >3.1.11</ cxf.version >
</ properties >
< dependencies >
< dependency >
< groupId >org.apache.cxf</ groupId >
< artifactId >cxf-rt-rs-client</ artifactId >
< version >${cxf.version}</ version >
</ dependency >
</ dependencies >
< build >
< plugins >
< plugin >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-maven-plugin</ artifactId >
< configuration >
< mainClass >sample.rs.client.SpringBootClientApplication</ mainClass >
</ configuration >
</ plugin >
</ plugins >
</ build >
</ project >
|
Enabling WebClients
WebClient can be auto-wired with the help of EnableJaxRsWebClient annotation.
JAX-RS providers (annotated with @Provider) and marked as Spring Components are added to WebClient. The providers which are not marked as Spring Components can also be optionally auto-discovered. WebClient can also be configured with optional headers such as Accept and Content-Type and made thread-safe.
package sample.rs.client;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.client.spring.EnableJaxRsWebClient;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableJaxRsWebClient
public class SpringBootClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootClientApplication. class , args);
}
@Bean
CommandLineRunner initWebClientRunner( final WebClient webClient) {
return new CommandLineRunner() {
@Override
public void run(String... runArgs) throws Exception {
System.out.println(webClient.path( "sayHello/ApacheCxfWebClientUser" ).get(String. class ));
}
};
}
}
|
Enabling ProxyClients
Proxy Clients can be auto-wired with the help of EnableJaxRsProxyClient annotation.
It creates a proxy from the auto-discovered service class interface.
JAX-RS providers (annotated with @Provider) and marked as Spring Components are added to proxy clients. The providers which are not marked as Spring Components can also be optionally auto-discovered. Proxy can also be configured with optional headers such as Accept and Content-Type (if JAX-RS @Produces and/or @Consumes are missing or need to be overridden) and made thread-safe.
package sample.rs.client;
import org.apache.cxf.jaxrs.client.spring.EnableJaxRsProxyClient;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import sample.rs.service.HelloService;
@SpringBootApplication
@EnableJaxRsProxyClient
public class SpringBootClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootClientApplication. class , args);
}
@Bean
CommandLineRunner initProxyClientRunner( final HelloService client) {
return new CommandLineRunner() {
@Override
public void run(String... runArgs) throws Exception {
System.out.println(client.sayHello( "ApacheCxfProxyUser" ));
}
};
}
}
|
If you prefer to specify a proxy service interface directly in the client code you can drop EnableJaxRsProxyClient annotation and provide a simple JaxRsProxyClientConfiguration extension instead:
package sample.rs.client;
import org.apache.cxf.jaxrs.client.spring.JaxRsProxyClientConfiguration;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import sample.rs.service.HelloService;
@SpringBootApplication
public class SpringBootClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootClientApplication. class , args);
}
@Bean
CommandLineRunner initProxyClientRunner( final HelloService client) {
return new CommandLineRunner() {
@Override
public void run(String... runArgs) throws Exception {
System.out.println(client.sayHello( "ApacheCxfProxyUser" ));
}
};
}
@Configuration
static class HeloServiceConfiguration extends JaxRsProxyClientConfiguration {
@Override
protected Class<?> getServiceClass() {
return HelloService. class ;
}
}
}
|
Discovery of Service Endpoints
Discovery of JAX-RS endpoint addresses published to a well-known service registries such as Netflix Eureka Registry is shown in a JAX-RS Spring Boot Scan demo.
This is achieved with the help of CXF Failover and/or LoadBalancing features.
Configuration
The configuration properties apply to both WebClient and Proxy configurations.
cxf.jaxrs.client.address is a required property which identifies a target address.
cxf.jaxrs.client.thread-safe property can be set to true to make the clients thread-safe.
cxf.jaxrs.client.headers.accept property can be used to set HTTP Accept header.
cxf.jaxrs.client.headers.content-type property can be used to set HTTP Content-Type header.
cxf.jaxrs.client.classes-scan-packages property can be used to auto-discover JAX-RS service class interfaces (for proxies) and providers for proxies and web clients.