diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/DispatcherHandler.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/DispatcherHandler.java index eaa72d55a0..58d6c986f0 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/DispatcherHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/DispatcherHandler.java @@ -25,16 +25,17 @@ import org.apache.commons.logging.LogFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; 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.web.server.ResponseStatusException; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.HttpWebHandlerAdapter; /** * Central dispatcher for HTTP request handlers/controllers. Dispatches to registered @@ -57,13 +58,13 @@ import org.springframework.web.server.WebHandler; */ public class DispatcherHandler implements WebHandler, ApplicationContextAware { - private static final Log logger = LogFactory.getLog(DispatcherHandler.class); - @SuppressWarnings("ThrowableInstanceNeverThrown") private static final Exception HANDLER_NOT_FOUND_EXCEPTION = new ResponseStatusException(HttpStatus.NOT_FOUND, "No matching handler"); + private static final Log logger = LogFactory.getLog(DispatcherHandler.class); + private List handlerMappings; private List handlerAdapters; @@ -71,16 +72,24 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { private List resultHandlers; + /** + * Create a new {@code DispatcherHandler} which needs to be configured with + * an {@link ApplicationContext} through {@link #setApplicationContext}. + */ public DispatcherHandler() { } + /** + * Create a new {@code DispatcherHandler} for the given {@link ApplicationContext}. + * @param applicationContext the application context to find the handler beans in + */ public DispatcherHandler(ApplicationContext applicationContext) { initStrategies(applicationContext); } @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + public void setApplicationContext(ApplicationContext applicationContext) { initStrategies(applicationContext); } @@ -135,7 +144,7 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { } private HandlerResultHandler getResultHandler(HandlerResult handlerResult) { - for (HandlerResultHandler resultHandler : resultHandlers) { + for (HandlerResultHandler resultHandler : this.resultHandlers) { if (resultHandler.supports(handlerResult)) { return resultHandler; } @@ -143,4 +152,28 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { throw new IllegalStateException("No HandlerResultHandler for " + handlerResult.getReturnValue()); } + + /** + * Expose a dispatcher-based {@link WebHandler} for the given application context, + * typically for further configuration with filters and exception handlers through + * a {@link org.springframework.web.server.adapter.WebHttpHandlerBuilder}. + * @param applicationContext the application context to find the handler beans in + * @see #DispatcherHandler(ApplicationContext) + */ + public static WebHandler toWebHandler(ApplicationContext applicationContext) { + return new DispatcherHandler(applicationContext); + } + + /** + * Expose a dispatcher-based {@link HttpHandler} for the given application context, + * typically for direct registration with an engine adapter such as + * {@link org.springframework.http.server.reactive.ReactorHttpHandlerAdapter}. + * @param applicationContext the application context to find the handler beans in + * @see #DispatcherHandler(ApplicationContext) + * @see HttpWebHandlerAdapter + */ + public static HttpHandler toHttpHandler(ApplicationContext applicationContext) { + return new HttpWebHandlerAdapter(new DispatcherHandler(applicationContext)); + } + }