By default ClientHttpRequestFactories created using RestTemplateBuilder.requestFactory(settings) will have only 3 properties applicable sslbundle and some timeouts.

If I need to have both ssl and for instance configure some more flags on the specific client I cannot use the factory, and I am forced to either duplicate the FactoryLogic (client is not protected so extending does not help) or duplicate the property / ssl configuration.

builder
   .setSslBundle(bundles.getBundle("some"))
   .requestFactory((settings) -> {
       // no way to pass client here
       return ClientHttpRequestFactories.get(OkHttp3ClientHttpRequestFactory.class, settings);
    })
    .build()
builder
    .setSslBundle(bundles.getBundle("some"))
   .requestFactory((settings) -> {
       var clientBuilder = new OkHttpClient.Builder();
       clientBuilder.callTimeout(Duration.ofSeconds(3));

       // Adapted from ClientHttpRequestFactories.OkHttp
       Assert.state(settings.bufferRequestBody() == null, 
            () -> "OkHttp3ClientHttpRequestFactory does not support request body buffering");
       PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
       map.from(settings::connectTimeout).to(clientBuilder::connectTimeout);
       map.from(settings::readTimeout).to(clientBuilder::readTimeout);

       SslBundle sslBundle = settings.sslBundle();
       if (sslBundle != null) {
           Assert.state(!sslBundle.getOptions().isSpecified(), "SSL Options cannot be specified with OkHttp");
           SSLSocketFactory socketFactory = sslBundle.createSslContext().getSocketFactory();
           TrustManager[] trustManagers = sslBundle.getManagers().getTrustManagers();
            Assert.state(trustManagers.length == 1,
               "Trust material must be provided in the SSL bundle for OkHttp3ClientHttpRequestFactory");
            clientBuilder
                .sslSocketFactory(socketFactory, (X509TrustManager) trustManagers[0]);

       }
       return new OkHttp3ClientHttpRequestFactory(clientBuilder.build());
  })
  .build();

Comment From: wilkinsona

See also #36263 and #36266.

Comment From: krodyrobi

As a side note, the factory cleans up it's own created client but, if someone uses the property mutators it creates a new one, only the last client built will ever be cleaned up.