本文出自iteye http://fair-jm.iteye.com/ 转截请注明出处
需求比较特殊,需要将一个项目的ModelAndView的action全部转成API返回的形式,返回代表JSON的字符串.
如果手工去改,那工作量很大且非常无聊,最好的方式就是在切面进行操作.
最后考虑在Interceptor中实现,这个Interceptor放在第一个位置,preHandle默认返回true(不覆写),postHandle中能接触到ModelAndView以及Response就在这里操作,最后的代码如下:
public class ModelAndViewToResponseBodyInterceptor extends HandlerInterceptorAdapter { //用jasckson做Map的序列化 private final ObjectMapper objectMapper = new ObjectMapper(); // 使用Spring的HttpMessageConvert输出信息 private final StringHttpMessageConverter mConverter = new StringHttpMessageConverter(); // 输出的media type 可以换成application json private final MediaType mMediaType = new MediaType("text", "plain", Charset.forName("UTF-8")); { //因为用了StringHttpMessageConverter Response默认会有一大堆的Accept-Charset 不要打 mConverter.setWriteAcceptCharset(false); } @Override public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ModelAndView modelAndView) throws Exception { if (modelAndView != null) { final String viewName = modelAndView.getViewName(); final Map<String, Object> model = new HashMap<>(modelAndView.getModelMap().size(), 1); for(final Entry<String,Object> entry : modelAndView.getModelMap().entrySet()) { // spring会向ModelAndView中写入BindResult 这样的对象是不能序列化的... if(entry.getKey().startsWith("org.springframework.validation")) { continue; } model.put(entry.getKey(), entry.getValue()); } model.put("OLD_VIEW_NAME", viewName); final HttpOutputMessage outputMessage = new ServletServerHttpResponse(response); mConverter.write(objectMapper.writeValueAsString(model), mMediaType, outputMessage); modelAndView.clear(); } } }
modelAndView.clear();
这段代码不写会在Spring的DispatcherServlet中进行render,因为我们以及写了Response,二次写会报错.
相关代码:
// Did the handler return a view to render? if (mv != null && !mv.wasCleared()) { render(mv, processedRequest, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } }
不用StringHttpMessageConverter会乱码,之前直接写的Response的PrintWriter各种调编码还是乱码,最后拿了处理@ResponseBody注解的代码.
SpringMVC的一个切面会使用ModelFactory在ModelAndView对象里写入非数组 非集合 非基本类型的类的对象的BindResult,这个BindResult会造成序列化失败,而且不应在API中出现,可以特殊处理下.
以上.
相关推荐
关于springmvc中的ModelAndView的详细代码,可以更好的了解spring。
看透springMvc源代码分析与实践.pdf看透springMvc源代码分析与实践.pdf
SpringMVC ModelAndView、Model及Map、@SessionAttributes场景与应用
看透springMvc源代码分析与实践 源码。转:http://www.excelib.com/
SpringMvc 代码
完整的springmvc项目代码,简单的springmvc工程代码,项目框架。
主要介绍了SpringMVC ModelAndView的用法使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
【狂神SpringMVC配套课程代码】一共8个模块,大概可以看我的博客,都是自己学配套整理的 欢迎大家作为学习SpringMVC的参考!! 下面附上狂神B站课程网址,和我的博客笔记(共8章) 狂神老师B站课程:...
今天小编就为大家分享一篇SpringMVC的ModelAndView传值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
springmvc简单样例代码,可以参考一下
本博客https://blog.csdn.net/qq_40634846有零基础入门SpringMVC,有兴趣的朋友可关注本博客
SpringMVC 实例代码SpringMVC 实例代码SpringMVC 实例代码SpringMVC 实例代码SpringMVC 实例代码SpringMVC 实例代码SpringMVC 实例代码
。。。。。。。SpringMVC基于代码的配置方式(零配置,无web.xml)
第二篇(第8~10章)对SpringMVC的整体结构进行分析,涉及SpringMVC的配置、创建及用法,旨在帮助大家理解SpringMVC的架构与实际操作。第三篇(第11~20章)详细分析SpringMVC的九大组件的实现方法,涉及每个组件的...
springmvc的帮助文档api,内包含中文和英文的版本,离线版,chm格式, 是非常好用的.有需要的可以自行下载。
springmvc 简单架构代码,对初学者有帮助
maven springmvc 项目代码 可正常运行
SpringMVC的代码简单实现,利用元注解和反射技术自己实现SpringMVC的注解功能