86
86
*/
87
87
public final class WebClient {
88
88
89
- private static final ClassLoader classLoader = WebClient .class .getClassLoader ();
89
+ private static final boolean jackson2Present =
90
+ ClassUtils .isPresent ("com.fasterxml.jackson.databind.ObjectMapper" , WebClient .class .getClassLoader ()) &&
91
+ ClassUtils .isPresent ("com.fasterxml.jackson.core.JsonGenerator" , WebClient .class .getClassLoader ());
90
92
91
- private static final boolean jackson2Present = ClassUtils
92
- .isPresent ("com.fasterxml.jackson.databind.ObjectMapper" , classLoader )
93
- && ClassUtils .isPresent ("com.fasterxml.jackson.core.JsonGenerator" ,
94
- classLoader );
93
+ private static final boolean jaxb2Present =
94
+ ClassUtils .isPresent ("javax.xml.bind.Binder" , WebClient .class .getClassLoader ());
95
95
96
- private static final boolean jaxb2Present = ClassUtils
97
- .isPresent ("javax.xml.bind.Binder" , classLoader );
98
96
99
97
private ClientHttpConnector clientHttpConnector ;
100
98
@@ -107,15 +105,13 @@ public final class WebClient {
107
105
* Create a {@code WebClient} instance, using the {@link ClientHttpConnector}
108
106
* implementation given as an argument to drive the underlying
109
107
* implementation.
110
- *
111
108
* Register by default the following Encoders and Decoders:
112
109
* <ul>
113
110
* <li>{@link ByteBufferEncoder} / {@link ByteBufferDecoder}</li>
114
111
* <li>{@link CharSequenceEncoder} / {@link StringDecoder}</li>
115
112
* <li>{@link Jaxb2XmlEncoder} / {@link Jaxb2XmlDecoder}</li>
116
113
* <li>{@link Jackson2JsonEncoder} / {@link Jackson2JsonDecoder}</li>
117
114
* </ul>
118
- *
119
115
* @param clientHttpConnector the {@code ClientHttpRequestFactory} to use
120
116
*/
121
117
public WebClient (ClientHttpConnector clientHttpConnector ) {
@@ -124,8 +120,9 @@ public WebClient(ClientHttpConnector clientHttpConnector) {
124
120
this .webClientConfig .setResponseErrorHandler (new DefaultResponseErrorHandler ());
125
121
}
126
122
123
+
127
124
/**
128
- * Adds default HTTP message readers.
125
+ * Add default HTTP message readers.
129
126
*/
130
127
protected final void addDefaultHttpMessageReaders (List <HttpMessageReader <?>> messageReaders ) {
131
128
messageReaders .add (new DecoderHttpMessageReader <>(new ByteBufferDecoder ()));
@@ -140,7 +137,7 @@ protected final void addDefaultHttpMessageReaders(List<HttpMessageReader<?>> mes
140
137
}
141
138
142
139
/**
143
- * Adds default HTTP message writers.
140
+ * Add default HTTP message writers.
144
141
*/
145
142
protected final void addDefaultHttpMessageWriters (List <HttpMessageWriter <?>> messageWriters ) {
146
143
messageWriters .add (new EncoderHttpMessageWriter <>(new ByteBufferEncoder ()));
@@ -187,19 +184,17 @@ public void setInterceptors(List<ClientHttpRequestInterceptor> interceptors) {
187
184
Collections .unmodifiableList (interceptors ) : Collections .emptyList ());
188
185
}
189
186
187
+
190
188
/**
191
189
* Perform the actual HTTP request/response exchange
192
- *
193
- * <p>
194
- * Requesting from the exposed {@code Flux} will result in:
190
+ * <p>Requesting from the exposed {@code Flux} will result in:
195
191
* <ul>
196
192
* <li>building the actual HTTP request using the provided {@code ClientWebRequestBuilder}</li>
197
193
* <li>encoding the HTTP request body with the configured {@code HttpMessageWriter}s</li>
198
194
* <li>returning the response with a publisher of the body</li>
199
195
* </ul>
200
196
*/
201
197
public WebResponseActions perform (ClientWebRequestBuilder builder ) {
202
-
203
198
ClientWebRequest clientWebRequest = builder .build ();
204
199
DefaultClientHttpRequestInterceptionChain interception =
205
200
new DefaultClientHttpRequestInterceptionChain (this .clientHttpConnector ,
@@ -214,14 +209,14 @@ public WebResponseActions perform(ClientWebRequestBuilder builder) {
214
209
public void doWithStatus (Consumer <HttpStatus > consumer ) {
215
210
clientResponse .doOnNext (clientHttpResponse -> consumer .accept (clientHttpResponse .getStatusCode ()));
216
211
}
217
-
218
212
@ Override
219
213
public <T > T extract (ResponseExtractor <T > extractor ) {
220
214
return extractor .extract (clientResponse , webClientConfig );
221
215
}
222
216
};
223
217
}
224
218
219
+
225
220
protected class DefaultWebClientConfig implements WebClientConfig {
226
221
227
222
private List <HttpMessageReader <?>> messageReaders ;
@@ -230,7 +225,6 @@ protected class DefaultWebClientConfig implements WebClientConfig {
230
225
231
226
private ResponseErrorHandler responseErrorHandler ;
232
227
233
-
234
228
public DefaultWebClientConfig () {
235
229
this .messageReaders = new ArrayList <>();
236
230
addDefaultHttpMessageReaders (this .messageReaders );
@@ -266,13 +260,13 @@ public void setResponseErrorHandler(ResponseErrorHandler responseErrorHandler) {
266
260
}
267
261
}
268
262
263
+
269
264
protected class DefaultRequestCallback implements Function <ClientHttpRequest , Mono <Void >> {
270
265
271
266
private final ClientWebRequest clientWebRequest ;
272
267
273
268
private final List <Consumer <? super HttpMessage >> requestCustomizers ;
274
269
275
-
276
270
public DefaultRequestCallback (ClientWebRequest clientWebRequest ,
277
271
List <Consumer <? super HttpMessage >> requestCustomizers ) {
278
272
this .clientWebRequest = clientWebRequest ;
@@ -303,9 +297,8 @@ public Mono<Void> apply(ClientHttpRequest clientHttpRequest) {
303
297
}
304
298
305
299
@ SuppressWarnings ({"unchecked" , "rawtypes" })
306
- protected Mono <Void > writeRequestBody (Publisher <?> content ,
307
- ResolvableType requestType , ClientHttpRequest request ,
308
- List <HttpMessageWriter <?>> messageWriters ) {
300
+ protected Mono <Void > writeRequestBody (Publisher <?> content , ResolvableType requestType ,
301
+ ClientHttpRequest request , List <HttpMessageWriter <?>> messageWriters ) {
309
302
310
303
MediaType contentType = request .getHeaders ().getContentType ();
311
304
Optional <HttpMessageWriter <?>> messageWriter = resolveWriter (messageWriters , requestType , contentType );
@@ -324,6 +317,7 @@ protected Optional<HttpMessageWriter<?>> resolveWriter(List<HttpMessageWriter<?>
324
317
}
325
318
}
326
319
320
+
327
321
protected class DefaultClientHttpRequestInterceptionChain implements ClientHttpRequestInterceptionChain {
328
322
329
323
private final ClientHttpConnector connector ;
@@ -337,10 +331,9 @@ protected class DefaultClientHttpRequestInterceptionChain implements ClientHttpR
337
331
private int index ;
338
332
339
333
public DefaultClientHttpRequestInterceptionChain (ClientHttpConnector connector ,
340
- List <ClientHttpRequestInterceptor > interceptors ,
341
- ClientWebRequest clientWebRequest ) {
334
+ List <ClientHttpRequestInterceptor > interceptors , ClientWebRequest clientWebRequest ) {
342
335
343
- Assert .notNull (connector , "'connector' should not be null" );
336
+ Assert .notNull (connector , "ClientHttpConnector should not be null" );
344
337
this .connector = connector ;
345
338
this .interceptors = interceptors ;
346
339
this .clientWebRequest = clientWebRequest ;
@@ -364,7 +357,6 @@ public Mono<ClientHttpResponse> intercept(HttpMethod method, URI uri,
364
357
new DefaultRequestCallback (this .clientWebRequest , this .requestCustomizers ));
365
358
}
366
359
}
367
-
368
360
}
369
361
370
- }
362
+ }
0 commit comments