SpringMVC重要接口(二)HandlerMethodReturnValueHandler

来源:互联网 发布:g76车锥螺纹编程实例 编辑:程序博客网 时间:2024/06/16 12:21

我们在上一节提到,SpringMVC方法中的参数都是靠HandlerMethodArgumentResolver解析的,那返回值呢。

我们都使用过@ResponseBody注解,也知道它的作用,那又是谁来解析这个注解,使之输出我们想要的东西,本节我们一起来剖析org.springframework.web.method.support.HandlerMethodReturnValueHandler

这里写图片描述

这里写图片描述

  1. package org.springframework.web.method.support;
  2.  
  3. import org.springframework.core.MethodParameter;
  4. import org.springframework.web.context.request.NativeWebRequest;
  5.  
  6. /**
  7. * Strategy interface to handle the value returned from the invocation of a
  8. * handler method .
  9. *
  10. * @author Arjen Poutsma
  11. * @since 3.1
  12. * @see HandlerMethodArgumentResolver
  13. */
  14. public interface HandlerMethodReturnValueHandler {
  15.  
  16. /**
  17. * Whether the given {@linkplain MethodParameter method return type} is
  18. * supported by this handler.
  19. * @param returnType the method return type to check
  20. * @return {@code true} if this handler supports the supplied return type;
  21. * {@code false} otherwise
  22. */
  23. boolean supportsReturnType(MethodParameter returnType);
  24.  
  25. /**
  26. * Handle the given return value by adding attributes to the model and
  27. * setting a view or setting the
  28. * {@link ModelAndViewContainer#setRequestHandled} flag to {@code true}
  29. * to indicate the response has been handled directly.
  30. * @param returnValue the value returned from the handler method
  31. * @param returnType the type of the return value. This type must have
  32. * previously been passed to {@link #supportsReturnType} which must
  33. * have returned {@code true}.
  34. * @param mavContainer the ModelAndViewContainer for the current request
  35. * @param webRequest the current request
  36. * @throws Exception if the return value handling results in an error
  37. */
  38. void handleReturnValue(Object returnValue, MethodParameter returnType,
  39. ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
  40.  
  41. }

HandlerMethodArgumentResolver接口同样包含两个接口方法

  • supportsReturnType 
    通过该方法我们如果需要对某个参数进行处理 只要此处返回true即可, 
    通过MethodParameter可以获取该方法返回值上的一些信息, 如方法返回值中的注解信息等
  1. @Override
  2. public boolean supportsReturnType(MethodParameter returnType) {
  3. return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || returnType.hasMethodAnnotation(ResponseBody.class));
  4. }
  1. @Override
  2. public boolean supportsReturnType(MethodParameter returnType) {
  3. return ModelAndView.class.isAssignableFrom(returnType.getParameterType());
  4. }
  • resolveArgument 
    实现对返回值的处理操作。

这里写图片描述

这里写图片描述

这里写图片描述

SpringMVC自己的 
HandlerMethodReturnValueHandler有哪些,并且会以什么样的顺序执行呢? 
其实定义在RequestMappingHandlerAdapter里:
  1. /**
  2. * Return the list of return value handlers to use including built-in and
  3. * custom handlers provided via {@link #setReturnValueHandlers}.
  4. */
  5. private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
  6. List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();
  7.  
  8. // Single-purpose return value types
  9. handlers.add(new ModelAndViewMethodReturnValueHandler());
  10. handlers.add(new ModelMethodProcessor());
  11. handlers.add(new ViewMethodReturnValueHandler());
  12. handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters()));
  13. handlers.add(new StreamingResponseBodyReturnValueHandler());
  14. handlers.add(new HttpEntityMethodProcessor(getMessageConverters(),
  15. this.contentNegotiationManager, this.requestResponseBodyAdvice));
  16. handlers.add(new HttpHeadersReturnValueHandler());
  17. handlers.add(new CallableMethodReturnValueHandler());
  18. handlers.add(new DeferredResultMethodReturnValueHandler());
  19. handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));
  20.  
  21. // Annotation-based return value types
  22. handlers.add(new ModelAttributeMethodProcessor(false));
  23. handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(),
  24. this.contentNegotiationManager, this.requestResponseBodyAdvice));
  25.  
  26. // Multi-purpose return value types
  27. handlers.add(new ViewNameMethodReturnValueHandler());
  28. handlers.add(new MapMethodProcessor());
  29.  
  30. // Custom return value types
  31. if (getCustomReturnValueHandlers() != null) {
  32. handlers.addAll(getCustomReturnValueHandlers());
  33. }
  34.  
  35. // Catch-all
  36. if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {
  37. handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));
  38. }
  39. else {
  40. handlers.add(new ModelAttributeMethodProcessor(true));
  41. }
  42.  
  43. return handlers;
  44. }

HandlerMethodReturnValueHandler子类注解 or 类org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandlerModelAndVieworg.springframework.web.method.annotation.ModelMethodProcessorModelorg.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandlerVieworg.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandlerResponseEntityorg.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandlerStreamingResponseBodyorg.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessorHttpEntityorg.springframework.web.servlet.mvc.method.annotation.HttpHeadersReturnValueHandlerHttpHeadersorg.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandlerCallableorg.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler org.springframework.web.servlet.mvc.method.annotation.AsyncTaskMethodReturnValueHandlerWebAsyncTaskorg.springframework.web.method.annotation.ModelAttributeMethodProcessor@ModelAttributeorg.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@ResponseBodyorg.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandlerCharSequence 、voidorg.springframework.web.method.annotation.MapMethodProcessorMap


这里写图片描述

  1. <mvc:annotation-driven>
  2. <mvc:return-value-handlers>
  3. <bean class=""/>
  4. </mvc:return-value-handlers>
  5. </mvc:annotation-driven>






阅读全文
0 0
原创粉丝点击