提交 8a57997d 编写于 作者: J Juergen Hoeller

Avoid use of Objects.requireNonNull plus related polishing

上级 0be610b0
......@@ -24,7 +24,6 @@ import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CompletionStage;
import java.util.function.Consumer;
......@@ -67,7 +66,9 @@ import org.springframework.web.servlet.ModelAndView;
*/
final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T> {
private static final boolean reactiveStreamsPresent;
private static final boolean reactiveStreamsPresent = ClassUtils.isPresent(
"org.reactivestreams.Publisher", DefaultEntityResponseBuilder.class.getClassLoader());
private final T entity;
......@@ -79,11 +80,6 @@ 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;
......@@ -205,15 +201,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
return new CompletionStageEntityResponse(this.status, this.headers, this.cookies,
completionStage, this.entityType);
}
else if (reactiveStreamsPresent &&
PublisherEntityResponse.isPublisher(this.entity)) {
else if (reactiveStreamsPresent && PublisherEntityResponse.isPublisher(this.entity)) {
Publisher publisher = (Publisher) this.entity;
return new PublisherEntityResponse(this.status, this.headers, this.cookies, publisher,
this.entityType);
return new PublisherEntityResponse(this.status, this.headers, this.cookies, publisher, this.entityType);
}
else {
return new DefaultEntityResponse<>(this.status, this.headers, this.cookies, this.entity,
this.entityType);
return new DefaultEntityResponse<>(this.status, this.headers, this.cookies, this.entity, this.entityType);
}
}
......@@ -232,18 +225,17 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
return new DefaultEntityResponseBuilder<>(t, bodyType.getType());
}
/**
* Default {@link EntityResponse} implementation for synchronous bodies.
*/
private static class DefaultEntityResponse<T>
extends DefaultServerResponseBuilder.AbstractServerResponse
private static class DefaultEntityResponse<T> extends DefaultServerResponseBuilder.AbstractServerResponse
implements EntityResponse<T> {
private final T entity;
private final Type entityType;
public DefaultEntityResponse(int statusCode, HttpHeaders headers,
MultiValueMap<String, Cookie> cookies, T entity, Type entityType) {
......@@ -263,18 +255,15 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
throws ServletException, IOException {
writeEntityWithMessageConverters(this.entity, servletRequest,servletResponse, context);
return null;
}
@SuppressWarnings("unchecked")
protected void writeEntityWithMessageConverters(Object entity,
HttpServletRequest request, HttpServletResponse response,
ServerResponse.Context context)
protected void writeEntityWithMessageConverters(Object entity, HttpServletRequest request,
HttpServletResponse response, ServerResponse.Context context)
throws ServletException, IOException {
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response);
MediaType contentType = getContentType(response);
Class<?> entityClass = entity.getClass();
......@@ -307,9 +296,8 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
}
}
protected void tryWriteEntityWithMessageConverters(Object entity,
HttpServletRequest request, HttpServletResponse response,
ServerResponse.Context context) {
protected void tryWriteEntityWithMessageConverters(Object entity, HttpServletRequest request,
HttpServletResponse response, ServerResponse.Context context) {
try {
writeEntityWithMessageConverters(entity, request, response, context);
}
......@@ -334,12 +322,11 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
/**
* {@link EntityResponse} implementation for asynchronous {@link CompletionStage} bodies.
*/
private static class CompletionStageEntityResponse<T>
extends DefaultEntityResponse<CompletionStage<T>> {
private static class CompletionStageEntityResponse<T> extends DefaultEntityResponse<CompletionStage<T>> {
public CompletionStageEntityResponse(int statusCode, HttpHeaders headers,
MultiValueMap<String, Cookie> cookies, CompletionStage<T> entity,
Type entityType) {
MultiValueMap<String, Cookie> cookies, CompletionStage<T> entity, Type entityType) {
super(statusCode, headers, cookies, entity, entityType);
}
......@@ -348,7 +335,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
HttpServletResponse servletResponse, Context context) {
AsyncContext asyncContext = servletRequest.startAsync(servletRequest, servletResponse);
entity().whenComplete((entity, throwable) -> {
try {
if (entity != null) {
......@@ -370,11 +356,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
}
}
private static class PublisherEntityResponse<T> extends DefaultEntityResponse<Publisher<T>> {
public PublisherEntityResponse(int statusCode, HttpHeaders headers,
MultiValueMap<String, Cookie> cookies, Publisher<T> entity,
Type entityType) {
MultiValueMap<String, Cookie> cookies, Publisher<T> entity, Type entityType) {
super(statusCode, headers, cookies, entity, entityType);
}
......@@ -384,14 +371,12 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
AsyncContext asyncContext = servletRequest.startAsync(servletRequest,
new NoContentLengthResponseWrapper(servletResponse));
entity().subscribe(new ProducingSubscriber(asyncContext, context));
return null;
}
public static boolean isPublisher(Object o) {
return (o instanceof Publisher);
public static boolean isPublisher(Object entity) {
return (entity instanceof Publisher);
}
......@@ -405,16 +390,13 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
@Nullable
private Subscription subscription;
public ProducingSubscriber(AsyncContext asyncContext,
Context context) {
public ProducingSubscriber(AsyncContext asyncContext, Context context) {
this.asyncContext = asyncContext;
this.context = context;
}
@Override
public void onSubscribe(Subscription s) {
Objects.requireNonNull(s);
if (this.subscription == null) {
this.subscription = s;
this.subscription.request(Long.MAX_VALUE);
......@@ -426,27 +408,15 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
@Override
public void onNext(T element) {
Objects.requireNonNull(element);
HttpServletRequest servletRequest =
(HttpServletRequest) this.asyncContext.getRequest();
HttpServletResponse servletResponse =
(HttpServletResponse) this.asyncContext.getResponse();
tryWriteEntityWithMessageConverters(element,
servletRequest,
servletResponse,
this.context);
HttpServletRequest servletRequest = (HttpServletRequest) this.asyncContext.getRequest();
HttpServletResponse servletResponse = (HttpServletResponse) this.asyncContext.getResponse();
tryWriteEntityWithMessageConverters(element, servletRequest, servletResponse, this.context);
}
@Override
public void onError(Throwable t) {
Objects.requireNonNull(t);
handleError(t,
(HttpServletRequest) this.asyncContext.getRequest(),
(HttpServletResponse) this.asyncContext.getResponse(),
this.context);
handleError(t, (HttpServletRequest) this.asyncContext.getRequest(),
(HttpServletResponse) this.asyncContext.getResponse(), this.context);
this.asyncContext.complete();
}
......@@ -454,9 +424,9 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
public void onComplete() {
this.asyncContext.complete();
}
}
private static class NoContentLengthResponseWrapper extends HttpServletResponseWrapper {
public NoContentLengthResponseWrapper(HttpServletResponse response) {
......@@ -485,8 +455,6 @@ final class DefaultEntityResponseBuilder<T> implements EntityResponse.Builder<T>
public void setContentLengthLong(long len) {
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册