`

SpringMVC 老代码ModelAndView转为API

阅读更多

本文出自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中出现,可以特殊处理下.

 

以上.

0
0
分享到:
评论

相关推荐

    springmvc关于modelAndView的使用详细

    6. **最佳实践**:尽管ModelAndView提供了方便,但有时候过度使用ModelAndView可能导致代码过于耦合。在实际开发中,推荐使用`Model`接口,它可以直接作为控制器方法的参数,这样可以使代码更简洁,如: ```java ...

    使用SpringMVC的ModelAndView.zip

    在本文中,我们将深入探讨SpringMVC的工作原理、主要组件以及如何使用ModelAndView来处理请求和响应。 1. **SpringMVC概述** SpringMVC是一个轻量级的Web开发框架,它简化了将业务逻辑与呈现逻辑分离的过程。通过...

    看透springMvc源代码分析与实践

    《看透SpringMVC源代码分析与实践》是一本深入探讨Java网络编程和SpringMVC框架的专业书籍。这本书旨在帮助读者理解SpringMVC的核心机制,通过源代码分析,提升开发者在实际项目中的应用能力。SpringMVC是Spring框架...

    看透springMvc源代码分析与实践.pdf

    12. **RESTful API**:SpringMVC支持创建符合REST原则的API,通过@RequestMapping的属性可以轻松地定义资源路径。 13. **SpringMVC与其他Spring模块的集成**:如Spring Security进行安全控制,Spring Data JPA进行...

    SpringMVC ModelAndView的用法使用详解

    SpringMVC ModelAndView的用法使用详解 在SpringMVC框架中,ModelAndView扮演着非常重要的角色,它是SpringMVC在处理用户请求时所...本文通过示例代码和详细的解释,希望能够帮助大家更好地理解和使用ModelAndView。

    SpringMVC的ModelAndView传值方法

    SpringMVC的ModelAndView传值方法 SpringMVC框架提供了ModelAndView对象来实现从控制器到视图的数据传输。在本文中,我们将详细介绍SpringMVC的ModelAndView传值方法,包括将列表、单个值、Map对象和复杂对象传递到...

    SpringMVC例子代码小汇总

    **SpringMVC简介** SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-...提供的压缩包"SpringMVC"可能包含了一些示例代码,这些代码可以帮助初学者更好地理解和学习SpringMVC的使用。

    看透springMvc源代码分析与实践 源码

    4. **模型AndView(ModelAndView)**:Controller处理完请求后,返回一个ModelAndView对象,包含模型数据(Model)和视图名(ViewName),模型数据会被传递给视图用于渲染。 5. **视图解析器(ViewResolver)**:视图...

    传智播客 springmvc 视频 源代码 文档

    在这个"传智播客 springmvc 视频 源代码 文档"的资源包中,我们可以深入学习SpringMVC的精髓。 首先,视频教程很可能是讲解SpringMVC的基本概念、配置和使用方法,包括: 1. **环境搭建**:介绍如何配置Java开发...

    SpringMVC ModelAndView、Model及Map、@SessionAttributes场景与应用

    在Spring MVC框架中,ModelAndView、Model、Map以及@SessionAttributes是四个关键概念,它们在处理请求、数据传输和会话管理中起着至关重要的作用。让我们深入探讨这些概念及其在实际开发中的应用场景。 首先,`...

    【狂神SpringMVC配套课程代码】SpringMVC.zip

    【狂神SpringMVC配套课程代码】一共8个模块,大概可以看我的博客,都是自己学配套整理的 欢迎大家作为学习SpringMVC的参考!! 下面附上狂神B站课程网址,和我的博客笔记(共8章) 狂神老师B站课程:...

    springmvc 简单架构代码

    本项目提供了一个简单的 SpringMVC 架构代码,对于初学者来说,是一个很好的学习起点。 首先,我们要理解 SpringMVC 的核心概念。在 MVC 架构中,Model 负责业务逻辑和数据管理,View 负责用户界面展示,而 ...

    j2eeGenerator-1.0_代码生成器_springmvc_springmvc代码生成_feltfjc_

    j2eeGenerator-1.0是针对SpringMVC框架定制的一款代码生成工具,它的核心功能是自动生成与SpringMVC相兼容的Java代码,包括BO、Service、Controller以及对应的JSP页面。这样,开发者可以省去编写这些基础代码的时间...

    SpringMvc 代码

    在这个场景下,"SpringMvc 代码" 可能指的是包含有使用 Spring MVC 开发的控制器、模型、视图和配置文件的代码示例或者项目。 Jackson 是一个流行的 JSON 处理库,它在 Java 开发中被广泛用于序列化和反序列化 Java...

    SpringMVC基于代码的配置方式(零配置,无web.xml)

    本文将深入探讨如何在SpringMVC项目中实现基于代码的配置,以及如何在没有web.xml的情况下搭建一个完整的SpringMVC应用。 一、SpringMVC基础 SpringMVC是Spring框架的一部分,用于处理HTTP请求和响应。它提供了一...

    最容易理解的SpringMVC代码

    在这个"最容易理解的SpringMVC代码"中,我们将深入探讨SpringMVC的核心组件——ModelAndView。 ModelAndView是SpringMVC中的一个关键类,它结合了模型数据和视图逻辑。在处理用户请求时,控制器通常会创建一个...

Global site tag (gtag.js) - Google Analytics