spring mvc HandlerMethodReturnValueHandler

今天項目遇到一個問題:在controller裏重定向,正常使用 return "redirect:/url".結果怎麼都不可以,後來發現RequestMappingHandlerAdapter裏的HandlerMethodReturnValueHandlerComposite 對象裏的List<HandlerMethodReturnValueHandler> returnValueHandlers  被通過配置封裝去掉了ViewNameMethodReturnValueHandler。

Spring源碼:

	/**
	 * Iterate over registered {@link HandlerMethodReturnValueHandler}s and invoke the one that supports it.
	 * @exception IllegalStateException if no suitable {@link HandlerMethodReturnValueHandler} is found.
	 */
	public void handleReturnValue(
			Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
			throws Exception {

		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType);
		Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]");
		handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
	}


	/**
	 * Find a registered {@link HandlerMethodReturnValueHandler} that supports the given return type.
	 */
	private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) {
		for (HandlerMethodReturnValueHandler returnValueHandler : returnValueHandlers) {
			if (logger.isTraceEnabled()) {
				logger.trace("Testing if return value handler [" + returnValueHandler + "] supports [" +
						returnType.getGenericParameterType() + "]");
			}
			if (returnValueHandler.supportsReturnType(returnType)) {
				return returnValueHandler;
			}
		}
		return null;
	}


所以下面介紹一下下面幾個HandlerMethodReturnValueHandler的各實現類的作用:


1. ModelAndViewMethodReturnValueHandler

返回值類型是ModelAndView或其子類

2. ModelMethodProcessor

返回值類型是Model或其子類

3. ViewMethodReturnValueHandler

返回值類型是View或其子類 

4. HttpHeadersReturnValueHandler

返回值類型是HttpHeaders或其子類  

5. ModelAttributeMethodProcessor

返回值有@ModelAttribute註解

6. ViewNameMethodReturnValueHandler

返回值是void或String



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章