Browse Source

Remove direct Reactive Streams dependencies in Servlet.fn

Isolated direct dependencies to Reactive Streams types.
pull/22689/head
Arjen Poutsma 7 years ago
parent
commit
1c46a9a6ff
  1. 18
      spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java

18
spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@ -52,6 +52,7 @@ import org.springframework.http.converter.HttpMessageConverter; @@ -52,6 +52,7 @@ import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
@ -66,6 +67,8 @@ import org.springframework.web.servlet.ModelAndView; @@ -66,6 +67,8 @@ import org.springframework.web.servlet.ModelAndView;
*/
final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> {
private static final boolean reactiveStreamsPresent;
private final T entity;
private final Type entityType;
@ -76,6 +79,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> @@ -76,6 +79,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
private final MultiValueMap<String, Cookie> cookies = new LinkedMultiValueMap<>();
static {
ClassLoader classLoader = DefaultEntityResponseBuilder.class.getClassLoader();
reactiveStreamsPresent = ClassUtils.isPresent("org.reactivestreams.Publisher", classLoader);
}
private DefaultEntityResponseBuilder(T entity, @Nullable Type entityType) {
this.entity = entity;
@ -197,7 +205,8 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> @@ -197,7 +205,8 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
return new CompletionStageEntityResponse(this.status, this.headers, this.cookies,
completionStage, this.entityType);
}
else if (this.entity instanceof Publisher) {
else if (reactiveStreamsPresent &&
PublisherEntityResponse.isPublisher(this.entity)) {
Publisher publisher = (Publisher) this.entity;
return new PublisherEntityResponse(this.status, this.headers, this.cookies, publisher,
this.entityType);
@ -381,6 +390,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> @@ -381,6 +390,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
return null;
}
public static boolean isPublisher(Object o) {
return (o instanceof Publisher);
}
@SuppressWarnings("SubscriberImplementation")
private class ProducingSubscriber implements Subscriber<T> {

Loading…
Cancel
Save