|
|
|
@ -25,16 +25,17 @@ import org.apache.commons.logging.LogFactory;
@@ -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;
@@ -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<HandlerMapping> handlerMappings; |
|
|
|
|
|
|
|
|
|
private List<HandlerAdapter> handlerAdapters; |
|
|
|
@ -71,16 +72,24 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
@@ -71,16 +72,24 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware {
|
|
|
|
|
private List<HandlerResultHandler> 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 {
@@ -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 {
@@ -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)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|