Browse Source

Polishing

See gh-22991
pull/29461/head
rstoyanchev 3 years ago
parent
commit
fb22044c10
  1. 18
      spring-webflux/src/main/java/org/springframework/web/reactive/DispatchExceptionHandler.java
  2. 47
      spring-webflux/src/main/java/org/springframework/web/reactive/HandlerAdapter.java
  3. 14
      spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java
  4. 2
      spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResultHandler.java

18
spring-webflux/src/main/java/org/springframework/web/reactive/DispatchExceptionHandler.java

@ -23,17 +23,29 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* Contract to map a {@link Throwable} to a {@link HandlerResult}. * Contract to map a {@link Throwable} to a {@link HandlerResult}.
* *
* <p>Supported by {@link DispatcherHandler} when used in the following ways:
* <ul>
* <li>Set on a {@link HandlerResult#setExceptionHandler HandlerResult}, allowing
* a {@link HandlerAdapter} to apply its exception handling to deferred exceptions
* from asynchronous return values, and to response rendering.
* <li>Implemented by a {@link HandlerAdapter} in order to handle exceptions that
* occur before a request is mapped to a handler.
* </ul>
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @since 6.0 * @since 6.0
* @see HandlerAdapter
* @see HandlerResult#setExceptionHandler(DispatchExceptionHandler)
*/ */
public interface DispatchExceptionHandler { public interface DispatchExceptionHandler {
/** /**
* Handler the given exception and resolve it to {@link HandlerResult} that * Handle the given exception, mapping it to a {@link HandlerResult} that can
* can be used for rendering an HTTP response. * then be used to render an HTTP response.
* @param exchange the current exchange * @param exchange the current exchange
* @param ex the exception to handle * @param ex the exception to handle
* @return a {@code Mono} that emits a {@code HandlerResult} or the original exception * @return a {@code Mono} that emits a {@code HandlerResult} or an error
* signal with the original exception if it remains not handled
*/ */
Mono<HandlerResult> handleError(ServerWebExchange exchange, Throwable ex); Mono<HandlerResult> handleError(ServerWebExchange exchange, Throwable ex);

47
spring-webflux/src/main/java/org/springframework/web/reactive/HandlerAdapter.java

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

14
spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java

@ -128,11 +128,9 @@ public class HandlerResult {
} }
/** /**
* A {@link HandlerAdapter} may use this to provide an exception handler * {@link HandlerAdapter} classes can set this to have their exception
* to use to map exceptions from handling this result into an alternative * handling mechanism applied to response rendering and to deferred
* one. Especially when the return value is asynchronous, an exception is * exceptions when invoking a handler with an asynchronous return value.
* not be produced at the point of handler invocation, but rather later when
* result handling causes the actual value or an exception to be produced.
* @param exceptionHandler the exception handler to use * @param exceptionHandler the exception handler to use
* @since 6.0 * @since 6.0
*/ */
@ -152,9 +150,9 @@ public class HandlerResult {
} }
/** /**
* Configure an exception handler that may be used to produce an alternative * {@link HandlerAdapter} classes can set this to have their exception
* result when result handling fails. Especially for an async return value * handling mechanism applied to response rendering and to deferred
* errors may occur after the invocation of the handler. * exceptions when invoking a handler with an asynchronous return value.
* @param function the error handler * @param function the error handler
* @return the current instance * @return the current instance
* @deprecated in favor of {@link #setExceptionHandler(DispatchExceptionHandler)} * @deprecated in favor of {@link #setExceptionHandler(DispatchExceptionHandler)}

2
spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResultHandler.java

@ -21,7 +21,7 @@ import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
/** /**
* Process the {@link HandlerResult}, usually returned by an {@link HandlerAdapter}. * Process the {@link HandlerResult}, usually returned by a {@link HandlerAdapter}.
* *
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Sebastien Deleuze * @author Sebastien Deleuze

Loading…
Cancel
Save