private ServletInvocableHandlerMethod getHandlerMethod(Object controller, String methodName, Class<?>... argTypes) throws NoSuchMethodException { Method method = controller.getClass().getDeclaredMethod(methodName, argTypes); ServletInvocableHandlerMethod handlerMethod = new ServletInvocableHandlerMethod(controller, method); handlerMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); handlerMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); return handlerMethod; }
Object... providedArgs) throws Exception { Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs); setResponseStatus(webRequest); if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) { mavContainer.setRequestHandled(true); return; else if (StringUtils.hasText(getResponseStatusReason())) { mavContainer.setRequestHandled(true); return; try { this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); logger.trace(formatErrorForReturnValue(returnValue), ex);
/** * Bridge to actual controller type-level annotations. */ @Override public Class<?> getBeanType() { return ServletInvocableHandlerMethod.this.getBeanType(); }
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); invocableMethod.setDataBinderFactory(binderFactory); invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer); return "Resume with async result [" + formatted + "]"; }); invocableMethod = invocableMethod.wrapConcurrentResult(result); invocableMethod.invokeAndHandle(webRequest, mavContainer); if (asyncManager.isConcurrentHandlingStarted()) { return null;
@Test public void wrapConcurrentResult_ResponseEntity() throws Exception { this.returnValueHandlers.addHandler(new HttpEntityMethodProcessor(this.converters)); ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseEntityHandler(), "handleDeferred"); handlerMethod = handlerMethod.wrapConcurrentResult(new ResponseEntity<>("bar", HttpStatus.OK)); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); assertEquals("bar", this.response.getContentAsString()); }
exceptionHandlerMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); exceptionHandlerMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); if (cause != null) { exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, cause, handlerMethod); exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, handlerMethod);
/** * Create a {@link ServletInvocableHandlerMethod} from the given {@link HandlerMethod} definition. * @param handlerMethod the {@link HandlerMethod} definition * @return the corresponding {@link ServletInvocableHandlerMethod} (or custom subclass thereof) * @since 4.2 */ protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) { return new ServletInvocableHandlerMethod(handlerMethod); }
@Test public void invokeAndHandle_VoidWithComposedResponseStatus() throws Exception { ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "composedResponseStatus"); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); assertTrue("Null return value + @ComposedResponseStatus should result in 'request handled'", this.mavContainer.isRequestHandled()); assertEquals(HttpStatus.BAD_REQUEST.value(), this.response.getStatus()); }
private void wrapConcurrentResult_ResponseBody(Object handler, Object result, Class<?> expectedReturnType) throws Exception { this.returnValueHandlers.addHandler(new ModelAndViewMethodReturnValueHandler()); this.returnValueHandlers.addHandler(new RequestResponseBodyMethodProcessor(this.converters)); ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(handler, "handle"); handlerMethod = handlerMethod.wrapConcurrentResult(result); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); assertEquals((result != null ? result.toString() : ""), this.response.getContentAsString()); assertEquals(expectedReturnType, handlerMethod.getReturnValueType(result).getParameterType()); }
invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); invocableMethod.setDataBinderFactory(binderFactory); invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer); logger.debug("Found concurrent result value [" + result + "]"); invocableMethod = invocableMethod.wrapConcurrentResult(result); invocableMethod.invokeAndHandle(webRequest, mavContainer); if (asyncManager.isConcurrentHandlingStarted()) { return null;
exceptionHandlerMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); exceptionHandlerMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
@Override public void setHandlerMethodArgumentResolvers(HandlerMethodArgumentResolverComposite argumentResolvers) { super.setHandlerMethodArgumentResolvers(new ResolverCompositeWrapper(argumentResolvers, mapping)); } }
/** * Bridge to controller method-level annotations. */ @Override public <A extends Annotation> A getMethodAnnotation(Class<A> annotationType) { return ServletInvocableHandlerMethod.this.getMethodAnnotation(annotationType); }
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); invocableMethod.setDataBinderFactory(binderFactory); invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer); return "Resume with async result [" + formatted + "]"; }); invocableMethod = invocableMethod.wrapConcurrentResult(result); invocableMethod.invokeAndHandle(webRequest, mavContainer); if (asyncManager.isConcurrentHandlingStarted()) { return null;
@Test // SPR-12287 public void wrapConcurrentResult_ResponseEntityNullBody() throws Exception { this.returnValueHandlers.addHandler(new HttpEntityMethodProcessor(this.converters)); ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseEntityHandler(), "handleDeferred"); handlerMethod = handlerMethod.wrapConcurrentResult(new ResponseEntity<>(HttpStatus.OK)); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); assertEquals(200, this.response.getStatus()); assertEquals("", this.response.getContentAsString()); }
exceptionHandlerMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); exceptionHandlerMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); if (cause != null) { exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, cause, handlerMethod); exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, handlerMethod);
/** * Create a {@link ServletInvocableHandlerMethod} from the given {@link HandlerMethod} definition. * @param handlerMethod the {@link HandlerMethod} definition * @return the corresponding {@link ServletInvocableHandlerMethod} (or custom subclass thereof) * @since 4.2 */ protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) { return new ServletInvocableHandlerMethod(handlerMethod); }
@Test public void invokeAndHandle_VoidWithTypeLevelResponseStatus() throws Exception { ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseStatusHandler(), "handle"); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); assertTrue(this.mavContainer.isRequestHandled()); assertEquals(HttpStatus.BAD_REQUEST.value(), this.response.getStatus()); }
/** * Bridge to controller method-level annotations. */ @Override public <A extends Annotation> A getMethodAnnotation(Class<A> annotationType) { return ServletInvocableHandlerMethod.this.getMethodAnnotation(annotationType); }
argumentResolvers.addResolver(new NavigationContextMethodArgumentResolver(context)); ServletInvocableHandlerMethod invocable = createInvocableNavigationMethod(bean, navigationMethod.getMethod()); invocable.setDataBinderFactory(binderFactory); invocable.setHandlerMethodArgumentResolvers(argumentResolvers); invocable.setParameterNameDiscoverer(this.parameterNameDiscoverer); invocable.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); (HttpServletResponse) externalContext.getResponse()); ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer(); invocable.invokeAndHandle(request, modelAndViewContainer); if (modelAndViewContainer.isRequestHandled()) { return null;