|
|
|
|
@ -21,16 +21,16 @@ import reactor.core.publisher.Mono;
@@ -21,16 +21,16 @@ import reactor.core.publisher.Mono;
|
|
|
|
|
import org.springframework.web.server.ServerWebExchange; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Contract that decouples the {@link DispatcherHandler} from the details of |
|
|
|
|
* invoking a handler and makes it possible to support any handler type. |
|
|
|
|
* Contract to abstract the details of invoking a handler of a given type. |
|
|
|
|
* |
|
|
|
|
* <p>A {@code HandlerAdapter} can implement {@link DispatchExceptionHandler} |
|
|
|
|
* if it wants to handle an exception that occurred before the request is mapped |
|
|
|
|
* to a handler. This allows the {@code HandlerAdapter} to expose a consistent |
|
|
|
|
* exception handling mechanism for any request handling error. |
|
|
|
|
* In Reactive Streams terms, {@link #handle} processes the onNext, while |
|
|
|
|
* {@link DispatchExceptionHandler#handleError} processes the onError signal |
|
|
|
|
* from the upstream. |
|
|
|
|
* <p>An implementation can also choose to be an instance of |
|
|
|
|
* {@link DispatchExceptionHandler} if it wants to handle exceptions that occur |
|
|
|
|
* before the request is successfully mapped to a handler. This allows a |
|
|
|
|
* {@code HandlerAdapter} to expose the same exception handling both for handler |
|
|
|
|
* invocation errors and for errors before a handler is selected. |
|
|
|
|
* In Reactive Streams terms, {@link #handle} handles the onNext signal, while |
|
|
|
|
* {@link DispatchExceptionHandler#handleError} handles the onError signal |
|
|
|
|
* from the dispatch processing chain. |
|
|
|
|
* |
|
|
|
|
* @author Rossen Stoyanchev |
|
|
|
|
* @author Sebastien Deleuze |
|
|
|
|
@ -46,20 +46,27 @@ public interface HandlerAdapter {
@@ -46,20 +46,27 @@ public interface HandlerAdapter {
|
|
|
|
|
boolean supports(Object handler); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Handle the request with the given handler. |
|
|
|
|
* <p>Implementations are encouraged to handle exceptions resulting from the |
|
|
|
|
* invocation of a handler in order and if necessary to return an alternate |
|
|
|
|
* result that represents an error response. |
|
|
|
|
* <p>Furthermore since an async {@code HandlerResult} may produce an error |
|
|
|
|
* later during result handling implementations are also encouraged to |
|
|
|
|
* {@link HandlerResult#setExceptionHandler(DispatchExceptionHandler) set |
|
|
|
|
* an exception handler} on the {@code HandlerResult} so that may also be |
|
|
|
|
* applied later after result handling. |
|
|
|
|
* Handle the request with the given handler, previously checked via |
|
|
|
|
* {@link #supports(Object)}. |
|
|
|
|
* <p>Implementations should consider the following for exception handling: |
|
|
|
|
* <ul> |
|
|
|
|
* <li>Handle invocation exceptions within this method. |
|
|
|
|
* <li>{@link HandlerResult#setExceptionHandler(DispatchExceptionHandler) |
|
|
|
|
* Set an exception handler} on the returned {@code HandlerResult} to handle |
|
|
|
|
* deferred exceptions from asynchronous return values, and to handle |
|
|
|
|
* exceptions from response rendering. |
|
|
|
|
* <li>Implement {@link DispatchExceptionHandler} to extend exception |
|
|
|
|
* handling to exceptions that occur before a handler is selected. |
|
|
|
|
* </ul> |
|
|
|
|
* @param exchange current server exchange |
|
|
|
|
* @param handler the selected handler which must have been previously |
|
|
|
|
* checked via {@link #supports(Object)} |
|
|
|
|
* @return {@link Mono} that emits a single {@code HandlerResult} or none if |
|
|
|
|
* the request has been fully handled and doesn't require further handling. |
|
|
|
|
* @return {@link Mono} that emits a {@code HandlerResult}, or completes |
|
|
|
|
* empty if the request is fully handled; any error signal would not be |
|
|
|
|
* handled within the {@link DispatcherHandler}, and would instead be |
|
|
|
|
* processed by the chain of registered |
|
|
|
|
* {@link org.springframework.web.server.WebExceptionHandler}s at the end |
|
|
|
|
* of the {@link org.springframework.web.server.WebFilter} chain |
|
|
|
|
*/ |
|
|
|
|
Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler); |
|
|
|
|
|
|
|
|
|
|