今天項目遇到一個問題:在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