From 1c46a9a6ff2dd094dc3d08e77bce1ad29e77617e Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 25 Mar 2019 16:16:12 +0100 Subject: [PATCH] Remove direct Reactive Streams dependencies in Servlet.fn Isolated direct dependencies to Reactive Streams types. --- .../function/DefaultEntityResponseBuilder.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java index 8dae09aebf6..1ac1bb957de 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java @@ -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; 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; */ final class DefaultEntityResponseBuilder implements EntityResponse.Builder { + private static final boolean reactiveStreamsPresent; + private final T entity; private final Type entityType; @@ -76,6 +79,11 @@ final class DefaultEntityResponseBuilder implements EntityResponse.Builder private final MultiValueMap 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 implements EntityResponse.Builder 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 implements EntityResponse.Builder return null; } + public static boolean isPublisher(Object o) { + return (o instanceof Publisher); + } + + @SuppressWarnings("SubscriberImplementation") private class ProducingSubscriber implements Subscriber {