19
19
import java .net .URI ;
20
20
import java .util .ArrayList ;
21
21
import java .util .Arrays ;
22
- import java .util .Collections ;
23
22
import java .util .LinkedHashMap ;
24
23
import java .util .List ;
25
24
import java .util .Map ;
@@ -111,6 +110,8 @@ final class DefaultRestClientBuilder implements RestClient.Builder {
111
110
112
111
private @ Nullable List <HttpMessageConverter <?>> messageConverters ;
113
112
113
+ private @ Nullable Consumer <HttpMessageConverters .ClientBuilder > convertersConfigurer ;
114
+
114
115
private ObservationRegistry observationRegistry = ObservationRegistry .NOOP ;
115
116
116
117
private @ Nullable ClientRequestObservationConvention observationConvention ;
@@ -142,6 +143,7 @@ public DefaultRestClientBuilder(DefaultRestClientBuilder other) {
142
143
this .initializers = (other .initializers != null ) ? new ArrayList <>(other .initializers ) : null ;
143
144
this .requestFactory = other .requestFactory ;
144
145
this .messageConverters = (other .messageConverters != null ? new ArrayList <>(other .messageConverters ) : null );
146
+ this .convertersConfigurer = other .convertersConfigurer ;
145
147
this .observationRegistry = other .observationRegistry ;
146
148
this .observationConvention = other .observationConvention ;
147
149
}
@@ -363,25 +365,30 @@ public RestClient.Builder requestFactory(ClientHttpRequestFactory requestFactory
363
365
@ Override
364
366
@ SuppressWarnings ("removal" )
365
367
public RestClient .Builder messageConverters (Consumer <List <HttpMessageConverter <?>>> configurer ) {
366
- configurer .accept (initMessageConverters ());
368
+ if (this .messageConverters == null ) {
369
+ this .messageConverters = new ArrayList <>();
370
+ HttpMessageConverters .forClient ().registerDefaults ().build ().forEach (this .messageConverters ::add );
371
+ }
372
+ configurer .accept (this .messageConverters );
367
373
validateConverters (this .messageConverters );
368
374
return this ;
369
375
}
370
376
371
377
@ Override
378
+ @ SuppressWarnings ("removal" )
372
379
public RestClient .Builder messageConverters (Iterable <HttpMessageConverter <?>> messageConverters ) {
373
380
validateConverters (messageConverters );
374
381
List <HttpMessageConverter <?>> converters = new ArrayList <>();
375
- messageConverters .forEach (converter -> converters . add ( converter ) );
376
- this .messageConverters = Collections . unmodifiableList ( converters ) ;
382
+ messageConverters .forEach (converters :: add );
383
+ this .messageConverters = converters ;
377
384
return this ;
378
385
}
379
386
380
387
@ Override
381
388
public RestClient .Builder configureMessageConverters (Consumer <HttpMessageConverters .ClientBuilder > configurer ) {
382
- HttpMessageConverters . ClientBuilder clientBuilder = HttpMessageConverters . forClient ();
383
- configurer . accept ( clientBuilder );
384
- return messageConverters ( clientBuilder . build ()) ;
389
+ this . convertersConfigurer = ( this . convertersConfigurer != null ?
390
+ this . convertersConfigurer . andThen ( configurer ) : configurer );
391
+ return this ;
385
392
}
386
393
387
394
@ Override
@@ -403,20 +410,11 @@ public RestClient.Builder apply(Consumer<RestClient.Builder> builderConsumer) {
403
410
return this ;
404
411
}
405
412
406
- @ SuppressWarnings ("removal" )
407
- private List <HttpMessageConverter <?>> initMessageConverters () {
408
- if (this .messageConverters == null ) {
409
- this .messageConverters = new ArrayList <>();
410
- HttpMessageConverters .forClient ().registerDefaults ().build ().forEach (this .messageConverters ::add );
411
- }
412
- return this .messageConverters ;
413
- }
414
-
415
- private void validateConverters (@ Nullable Iterable <HttpMessageConverter <?>> messageConverters ) {
416
- Assert .notNull (messageConverters , "At least one HttpMessageConverter is required" );
417
- Assert .isTrue (messageConverters .iterator ().hasNext (), "At least one HttpMessageConverter is required" );
418
- messageConverters .forEach (converter ->
419
- Assert .notNull (converter , "The HttpMessageConverter list must not contain null elements" ));
413
+ private void validateConverters (@ Nullable Iterable <HttpMessageConverter <?>> converters ) {
414
+ Assert .notNull (converters , "At least one HttpMessageConverter is required" );
415
+ Assert .isTrue (converters .iterator ().hasNext (), "At least one HttpMessageConverter is required" );
416
+ converters .forEach (converter -> Assert .notNull (converter ,
417
+ "The HttpMessageConverter list must not contain null elements" ));
420
418
}
421
419
422
420
@@ -427,14 +425,12 @@ public RestClient.Builder clone() {
427
425
428
426
@ Override
429
427
public RestClient build () {
428
+
430
429
ClientHttpRequestFactory requestFactory = initRequestFactory ();
431
430
UriBuilderFactory uriBuilderFactory = initUriBuilderFactory ();
432
-
433
431
HttpHeaders defaultHeaders = copyDefaultHeaders ();
434
432
MultiValueMap <String , String > defaultCookies = copyDefaultCookies ();
435
-
436
- List <HttpMessageConverter <?>> converters =
437
- (this .messageConverters != null ? this .messageConverters : initMessageConverters ());
433
+ List <HttpMessageConverter <?>> converters = initMessageConverters ();
438
434
439
435
return new DefaultRestClient (
440
436
requestFactory , this .interceptors , this .bufferingPredicate , this .initializers ,
@@ -495,4 +491,22 @@ private UriBuilderFactory initUriBuilderFactory() {
495
491
return CollectionUtils .unmodifiableMultiValueMap (copy );
496
492
}
497
493
494
+ private List <HttpMessageConverter <?>> initMessageConverters () {
495
+ HttpMessageConverters .ClientBuilder builder = HttpMessageConverters .forClient ();
496
+ if (this .messageConverters == null && this .convertersConfigurer == null ) {
497
+ builder .registerDefaults ();
498
+ }
499
+ else {
500
+ if (this .messageConverters != null ) {
501
+ this .messageConverters .forEach (builder ::customMessageConverter );
502
+ }
503
+ if (this .convertersConfigurer != null ) {
504
+ this .convertersConfigurer .accept (builder );
505
+ }
506
+ }
507
+ List <HttpMessageConverter <?>> result = new ArrayList <>();
508
+ builder .build ().forEach (result ::add );
509
+ return result ;
510
+ }
511
+
498
512
}
0 commit comments