栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring 3.2 @ResponseBody无法与Model返回值一起使用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring 3.2 @ResponseBody无法与Model返回值一起使用

这是Spring
3.2+(我不记得它是如何3.1)如何处理

@RequestMapping
方法的返回值的结果。Spring使用类型的实例
HandlerMethodReturnValueHandler
来解决应如何处理返回的值。遍历javadoc也可以看到不同的类型。

当您配置MVC环境时,如果您使用默认值

@EnableWebMVC
<mvc:annotation-driven>
,Spring将以特定顺序注册这些实例。这种情况发生在
RequestMappingHandlerAdapter#getDefaultReturnValueHandlers()
如下所示的方法中

private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {    List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();    // Single-purpose return value types    handlers.add(new ModelAndViewMethodReturnValueHandler());    handlers.add(new ModelMethodProcessor());    handlers.add(new ViewMethodReturnValueHandler());    handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.contentNegotiationManager));    handlers.add(new CallableMethodReturnValueHandler());    handlers.add(new DeferredResultMethodReturnValueHandler());    handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));    // Annotation-based return value types    handlers.add(new ModelAttributeMethodProcessor(false));    handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager));    // Multi-purpose return value types    handlers.add(new ViewNameMethodReturnValueHandler());    handlers.add(new MapMethodProcessor());    // Custom return value types    if (getCustomReturnValueHandlers() != null) {        handlers.addAll(getCustomReturnValueHandlers());    }    // Catch-all    if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {        handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));    }    else {        handlers.add(new ModelAttributeMethodProcessor(true));    }    return handlers;}

当您的方法返回值时,Spring遍历这些处理程序,调用它们的

supportsReturnType()
方法并选择第一个发现返回的方法
true

在这种情况下,“

ModelMethodProcessor
处理”
Model
返回值的优先级较高(在“
RequestResponseBodyMethodProcessor
处理” 之前已注册)
@ResponseBody

因此,您无法返回

Model
并通过将其转换为JSON
@ResponseBody
。我认为,您根本不应该这样做。在
Model
被访问的大部分地区
DispatcherServlet
堆栈,因此许多模块可以添加你可能不希望在最终的JSON
/删除属性。

就像在第二个示例中一样使用DTO。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615697.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号