`

包装spring的Controller的ResponseBody返回结果

阅读更多
ResponseBody是通过RequestResponseBodyMethodProcessor起作用的。
我们的做法是写一个包装类,替换掉他


package com.qq.secure.rj.webapp;

import com.google.common.collect.Lists;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;

import java.util.List;

/**
 * 替换为ResponseBody包装类
 * Created by yunbinhuang on 2015/10/13.
 */
public class ResponseBodyWrapFactoryBean implements InitializingBean {

    @Autowired
    private RequestMappingHandlerAdapter adapter;

    @Override
    public void afterPropertiesSet() throws Exception {
        List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers();
        List<HandlerMethodReturnValueHandler> handlers = Lists.newArrayList(returnValueHandlers);
        decorateHandlers(handlers);
        adapter.setReturnValueHandlers(handlers);
    }

    private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        for (HandlerMethodReturnValueHandler handler : handlers) {
            if (handler instanceof RequestResponseBodyMethodProcessor) {
                //用自己的ResponseBody包装类替换掉框架的,达到返回Result的效果
                ResponseBodyWrapHandler decorator = new ResponseBodyWrapHandler(handler);
                int index = handlers.indexOf(handler);
                handlers.set(index, decorator);
                break;
            }
        }
    }

}



package com.qq.secure.rj.webapp;

import com.qq.secure.rj.core.Result;
import com.qq.secure.rj.util.JacksonUtil;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * ResponseBody包装类,返回Result
 * Created by yunbinhuang on 2015/10/13.
 */
public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler{
    private final HandlerMethodReturnValueHandler delegate;
    public  ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate){
      this.delegate=delegate;
    }

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return delegate.supportsReturnType(returnType);
    }

    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        Result result = Result.success(returnValue);
        delegate.handleReturnValue(result,returnType,mavContainer,webRequest);
    }
}



 @Bean
    public ResponseBodyWrapFactoryBean getResponseBodyWrap() {
        return  new ResponseBodyWrapFactoryBean();
    }



注意  我们添加一个类似的HandlerMethodReturnValueHandler 是不起作用的。因为spring一种返回类型只能用一个。
1
1
分享到:
评论
3 楼 qq934752820 2016-08-26  
你好,最后一段代码是什么意思呢?这段代码是要放在哪里呢?
2 楼 huangyunbin 2015-11-07  
mhlx_qyh 写道
这样做的意义在哪里呢?什么场景下需要这样做呢?


我们的项目中所有的结果都是要包一层,变成如 {"resultCode":1,"data":{}}.之前是在每个cotroner自己包一下。但是这个其实可以用个公共类来全部解决的。
1 楼 mhlx_qyh 2015-10-15  
这样做的意义在哪里呢?什么场景下需要这样做呢?

相关推荐

    彻底根治Spring @ResponseBody JavaScript HTML特殊字符

    在开发Web应用时,我们经常会遇到一个问题:当使用Spring MVC的`@ResponseBody`注解将后端处理结果直接转化为HTTP响应体时,如果这个结果中包含HTML特殊字符,如尖角号、引号、按位与符号等,浏览器可能会误解析,...

    类似Spring Controller 注解Demo

    本文将深入探讨"类似Spring Controller注解Demo"这一主题,结合提供的标签"源码"和"工具",我们将分析Spring MVC中的Controller注解以及如何通过源码理解和应用它们。 Spring MVC是Spring框架的一部分,它提供了...

    spring Mvc配置xml使ResponseBody返回Json的方法示例

    在Spring MVC框架中,使用`@ResponseBody`注解可以方便地将控制器方法的返回值转换为JSON格式,然后发送到客户端。本篇文章将详细介绍如何在Spring MVC的XML配置中设置,以便让`@ResponseBody`自动将Java对象转换为...

    spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法

    spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法 在使用 Spring+Mybatis 框架时,经常会遇到一个问题,就是通过 @ResponseBody 返回结果时,中文字符会出现乱码的问题。这是因为在 Spring MVC 中,...

    SpringMVC中一个Controller多个方法

    它基于模型-视图-控制器(MVC)设计模式,其中Controller接收请求,Model处理数据,而View负责展示结果。在Spring MVC中,Controller类通常使用@Controller注解标识,并且可以包含多个处理请求的方法,这些方法通过@...

    Spring MVC中默认的ResponseBody为String的乱码问题.pdf

    在Spring MVC框架中,开发者经常遇到ResponseBody返回的字符串出现乱码的问题,特别是当字符串中包含中文字符时。这是因为Spring MVC默认使用了StringHttpMessageConverter来处理Response Body中的字符串,而这个...

    spring 统一再处理接口返回的json数据

    最近公司项目出现这样一个...在spring框架下,可以利用ResponseBodyAdvice接口,实现该接口则能够在声明了ResponseBody注解的controller返回json数据前,统一对json数据做处理,将资源地址的url统一替换为cdn资源url。

    Spring MVC – Easy REST-Based JSON Services with @ResponseBody

    例如,下面是一个简单的Controller示例,展示了如何使用`@RequestMapping`和`@ResponseBody`处理GET请求并返回JSON数据: ```java import org.springframework.web.bind.annotation.*; @RestController public ...

    springMVC3使用@ResponseBody向浏览器返回 json,注意区分jar包前缀

    -- @ResponseBody() spring-mvc 3 xml 配置--&gt; &lt;!--处理 @ResponseBody 中文乱码问题 --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt; ...

    Spring MVC之Controller层的常用注解

    本篇文章将深入探讨Spring MVC Controller层中的常用注解,帮助开发者更好地理解和运用这些注解来构建高效、可维护的Web应用。 1. `@Controller`:这是最基本的注解,表明一个类是Spring MVC的Controller。它通常...

    springmvc_controller_01

    1. **Controller 概念**:Controller 是 MVC 设计模式中的关键组件,负责接收来自客户端的请求,处理业务逻辑,并将结果转发给视图层展示。在 Spring MVC 中,Controller 通常是一个实现了 `org.springframework.web...

    Spring 相关jar包

    在Spring MVC中,可以配置ResponseBody和RequestBody注解,使得控制器方法可以直接返回JSON数据或接收JSON输入。 5. **SPRING压缩包文件**:提到的"SPRING"可能包含Spring框架的所有必需jar包,如spring-context、...

    springjpa 和 spring多视图配置实例

    Spring MVC可以通过配置,将Controller的返回结果转化为JSON格式,方便前端JavaScript处理。 在"SpringDataDemo"这个项目中,我们可以期待看到以下的配置和代码示例: 1. `pom.xml`文件会包含Spring、Spring MVC、...

    基于jpa+hibernate+spring+spring mvc注解方式项目

    - Service完成后,将结果返回给Controller。 - Controller将结果转换为JSON格式,通过`@ResponseBody`返回给前端。 - 前端接收到数据后,更新UI。 这个项目案例对于初学者来说,是一个很好的实践平台,可以帮助理解...

    Spring MVC 学习笔记 七 controller中其他可用的annotation

    在Spring MVC框架中,Controller是处理用户请求的核心组件。这篇"Spring MVC 学习笔记 七 controller中其他可用的annotation"可能涵盖了除我们常见的`@RequestMapping`之外的其他注解,这些注解使得控制器功能更加...

    Spring MVC 关于controller的字符编码问题

    总结来说,Spring MVC中处理Controller的字符编码问题主要是通过设置响应的`Content-Type`,使用`@RequestMapping`的`produces`属性,或者直接操作`HttpServletResponse`来指定字符集。同时,了解如何使用不同的参数...

    spring3-miniweb.rar_spring json_spring3_spring3 mvc

    例如,你可以创建一个接受POST请求的方法,该方法使用`@RequestBody`接收JSON数据,并用`@ResponseBody`返回结果。 ```java import org.springframework.web.bind.annotation.*; @RestController public class ...

    spring3 mvc 用 jquery ajax 交互

    这里的`@ResponseBody`注解表示返回的结果将直接写入HTTP响应体,而不是被视图解析器解析。 3. **编写jQuery AJAX**:在前端HTML页面中,使用jQuery的`$.ajax`方法发起请求。例如,向刚才创建的Controller发送POST...

    SpringMVC Controller 返回值的可选类型详解

    本文将详细解析Spring MVC Controller支持的多种返回值类型,以及它们各自的用法。 1. ModelAndView `ModelAndView`是Spring MVC提供的一种组合模型数据和视图的类。它允许开发者同时指定视图名称和模型数据。例如...

    Spring.MVC学习指南.pdf

    - `@Controller`:标记类为Spring MVC的Controller。 - `@Service`和`@Repository`:配合`@Autowired`进行依赖注入,常用于Service和DAO层。 - `@ResponseBody`:将方法返回值直接写入HTTP响应体。 - `@...

Global site tag (gtag.js) - Google Analytics