Browse Source

DispatcherHandler alignment with DispatcherServlet

Issue: SPR-15934
pull/1533/head
Rossen Stoyanchev 7 years ago
parent
commit
c28a6357c5
  1. 34
      spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java

34
spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java

@ -33,6 +33,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; @@ -33,6 +33,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.lang.Nullable;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebHandler;
@ -68,11 +69,14 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { @@ -68,11 +69,14 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
private static final Log logger = LogFactory.getLog(DispatcherHandler.class);
private List<HandlerMapping> handlerMappings = Collections.emptyList();
@Nullable
private List<HandlerMapping> handlerMappings;
private List<HandlerAdapter> handlerAdapters = Collections.emptyList();
@Nullable
private List<HandlerAdapter> handlerAdapters;
private List<HandlerResultHandler> resultHandlers = Collections.emptyList();
@Nullable
private List<HandlerResultHandler> resultHandlers;
/**
@ -95,8 +99,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { @@ -95,8 +99,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
* Return all {@link HandlerMapping} beans detected by type in the
* {@link #setApplicationContext injected context} and also
* {@link AnnotationAwareOrderComparator#sort(List) sorted}.
* @return immutable list with the configured mappings
* <p><strong>Note:</strong> This method may return {@code null} if invoked
* prior to {@link #setApplicationContext(ApplicationContext)}.
* @return immutable list with the configured mappings or {@code null}
*/
@Nullable
public List<HandlerMapping> getHandlerMappings() {
return this.handlerMappings;
}
@ -135,6 +142,9 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { @@ -135,6 +142,9 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
ServerHttpRequest request = exchange.getRequest();
logger.debug("Processing " + request.getMethodValue() + " request for [" + request.getURI() + "]");
}
if (this.handlerMappings == null) {
return Mono.error(HANDLER_NOT_FOUND_EXCEPTION);
}
return Flux.fromIterable(this.handlerMappings)
.concatMap(mapping -> mapping.getHandler(exchange))
.next()
@ -144,9 +154,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { @@ -144,9 +154,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
}
private Mono<HandlerResult> invokeHandler(ServerWebExchange exchange, Object handler) {
for (HandlerAdapter handlerAdapter : this.handlerAdapters) {
if (handlerAdapter.supports(handler)) {
return handlerAdapter.handle(exchange, handler);
if (this.handlerAdapters != null) {
for (HandlerAdapter handlerAdapter : this.handlerAdapters) {
if (handlerAdapter.supports(handler)) {
return handlerAdapter.handle(exchange, handler);
}
}
}
return Mono.error(new IllegalStateException("No HandlerAdapter: " + handler));
@ -159,9 +171,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { @@ -159,9 +171,11 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
}
private HandlerResultHandler getResultHandler(HandlerResult handlerResult) {
for (HandlerResultHandler resultHandler : this.resultHandlers) {
if (resultHandler.supports(handlerResult)) {
return resultHandler;
if (this.resultHandlers != null) {
for (HandlerResultHandler resultHandler : this.resultHandlers) {
if (resultHandler.supports(handlerResult)) {
return resultHandler;
}
}
}
throw new IllegalStateException("No HandlerResultHandler for " + handlerResult.getReturnValue());

Loading…
Cancel
Save