MicroProfile REST Client 3.0 behavior changes
With the release of the MicroProfile REST Client 3.0 feature (mpRestClient-3.0
), the underlying MicroProfile REST Client implementation for Open Liberty changes from Apache CXF to RESTEasy. This change results in certain API behavior changes that might require you to update your application code.
If you update your server from an earlier version of the MicroProfile REST Client feature to version 3.0, changes in API behavior might require you to update your application code. The following sections detail changes in behavior between the mpRestClient-2.0
and mpRestClient-3.0
features.
Injection for the @Context annotation is not provided in ClientHeadersFactory instances
In MicroProfile REST Client 3.0 and later, Open Liberty does not support the @Context
annotation as a portable injection mechanism in ClientHeadersFactory
instances. Code similar to the following example works with MicroProfile REST client 2.0, but fails in version 3.0.
public class CustomClientHeadersFactory implements ClientHeadersFactory {
@Context
private UriInfo uriInfo;
@Override
public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders,
MultivaluedMap<String, String> clientOutgoingHeaders) {
MultivaluedMap<String, String> myHeaders = new MultivaluedHashMap<>();
URI uri = uriInfo.getAbsolutePath(); // this line throws a NullPointerException in mpRestClient-3.0
myHeaders.putSingle("INJECTED_URI_INFO", uri == null ? "null" : uri.toString());
return myHeaders;
}
}
Although no direct substitution exists for code such as this, one workaround is to register a ClientRequestFilter
instance and then obtain configuration details from the passed-in ClientRequestContext
object. You can then store those objects in a ThreadLocal
instance that is read in the CustomClientHeadersFactory
class.
MicroProfile Fault Tolerance @Timeout annotation is not supported for synchronous REST client methods
In MicroProfile REST client 2.0 and earlier, you could use @Timeout
annotation to set timeouts for synchronous REST client interface methods. This configuration is not valid in the MicroProfile Rest Client 3.0 implementation. Instead, to configure your synchronous REST client methods to time out at a certain time, you must use the RestClientBuilder#connectionTimeout
and RestClientBuilder#readTimeout
APIs or configure the timeouts with MicroProfile Config. For more information, see MicroProfile 3.0: Support for MicroProfile Config.
Only synchronous REST clients are affected by this change. The @Timeout
annotation still works the same for asynchronous REST client methods in MicroProfile REST client 3.0 as it did in previous versions.
Enable CDI interceptors by using the @Priority annotation
If you package CDI interceptors and bind them to a REST client interface, you must enable them by using the @Priority
annotation. In previous MicroProfile REST client versions, you could also enable them by using the beans.xml
file but this option is not available in version 3.0 and later.
The following example shows the @Priority
annotation on an interceptor class.
@Loggable
@Interceptor
@Priority(10)
In this example, 10
is a sample value that determines the order in which interceptors are invoked when more than one exists.