public GuavaLFReturnValueHandler install(RequestMappingHandlerAdapter requestMappingHandlerAdapter) { final List<HandlerMethodReturnValueHandler> originalHandlers = new ArrayList<>( requestMappingHandlerAdapter.getReturnValueHandlers()); final int deferredPos = indexOfType(originalHandlers, DeferredResultMethodReturnValueHandler.class); // Add our handler directly after the deferred handler. originalHandlers.add(deferredPos + 1, this); requestMappingHandlerAdapter.setReturnValueHandlers(originalHandlers); return this; }
@Test public void handlerIsAfterDeferredResultMethodReturnValueHandler() { List<HandlerMethodReturnValueHandler> handlers = requestMappingHandlerAdapter.getReturnValueHandlers(); int lfHandlerIndex = indexOfType(handlers, GuavaLFReturnValueHandler.class); int drHandlerIndex = indexOfType(handlers, DeferredResultMethodReturnValueHandler.class); assertThat(lfHandlerIndex).isGreaterThan(drHandlerIndex); }
@PostConstruct public void init() { final List<HandlerMethodReturnValueHandler> originalHandlers = new ArrayList<>( requestMappingHandlerAdapter.getReturnValueHandlers()); final int deferredPos = obtainValueHandlerPosition(originalHandlers, DeferredResultMethodReturnValueHandler.class); // Add our handler directly after the deferred handler. originalHandlers.add(deferredPos + 1, completableFutureReturnValueHandler()); requestMappingHandlerAdapter.setReturnValueHandlers(originalHandlers); }