`

包装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特殊字符

    Spring MVC下彻底解决@ResponseBody转义html特殊字符问题,解决包括尖角号(),单引号('),双引号("),按位与(&),反斜杠(\)。

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

    主要给大家介绍了关于spring Mvc配置xml使ResponseBody返回Json的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

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

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

    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的字符编码问题

    在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面。

    华为技术专家整理Spring Boot 注解大全.docx

    注解 (annotations) 列表 @SpringBootApplication ...@RestController 注解是 @Controller 和 @ResponseBody 的合集, 表示这是个控制器 bean, 并且是将函数的返回值直 接填入 HTTP 响应体中, 是 REST 风格的控制器。

    Spring Boot最常用的30个注解.docx

    1 @Controller 2 @Service 3 @Repository 4 @Component 5 @Bean 6 @Configuration 三、 注入相关 1 @Resource 2 @Autowired 3 @Qualifier 4 @value 5 @ConfigurationProperties 四、 HTTP请求相关 1 @GetMapping 2 @...

    SpringBootTestApplication

    import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication ...

    spring-boot-reference.pdf

    Controller endpoints 50.9. Health Information 50.9.1. Auto-configured HealthIndicators 50.9.2. Writing Custom HealthIndicators 50.9.3. Reactive Health Indicators 50.9.4. Auto-configured ...

    Spring 4 + REST Web Service + JSON Example with Tomcat

    Spring 4 Web Service类用@RestController 进行注释, 可以取代@Controller和@ResponseBody的使用。要映射REST Web服务URL,请使用注释@RequestMapping。Web服务方法参数包含@RequestParam,该属性具有defaultValue...

    Spring注解 - 52注解 - 原稿笔记

    @ConfigurationProperties , @Controller , @CrossOrigin , @EnableWebMvc , @GetMapping , @Import , @JsonDeserialize , @JsonIgnore , @JsonIgnoreProperties , @JsonIgnoreType , @JsonInclude , @JsonProperty...

    spring-boot-annotation-list:Spring Boot应用程序中常用注解的精选列表

    @RestController -标记注释类为@Controller豆,并增加了@ResponseBody序列化返回的结果信息 @ Configuration-将带注释的类标记为定义bean的Java配置 @Service-将带注释的类标记为Bean(通常包含业务逻辑的约定) @...

    springboot学习思维笔记.xmind

    注入表达式云算结果 注入其他Bean的属性 注入文件内容 注入网址内容 注入属性文件 Bean的初始化和销毁 Java配置方式 注解方式 Profile @Profile 通过设定jvm的spring.profiles....

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    Maven构建SSM

    利用maven构建SSM框架程序,已经配置完全,后台controller可以用@ResponseBody返回数据,无需利用response.getWriter()和modelAndView

    spring mvc 注解

    2. Controller 注解 3. Service 注解 4. Component 注解 5. Repository 注解 6. CookieValue 注解 7. PathVariable 注解 8. RequestBody 注解 9. RequestHeader 注解 10. RequestMethod 类 11. RequestParam 注解 12...

    Picker:Spring MVC +Hibernate

    下面是功能交互图:#package介绍Controller层 .controller: 提供了返回@ResponseBody的url,web端的动态渲染使用。 .controller.rest(RESTful): 提供了返回Json格式的url,安卓端和web端的ajax使用。Service层 ....

    用ajax传递json到前台中文出现问号乱码问题的解决办法

    后来发现,因为在controller中返回json用了@ResponseBody,而spring源码中@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,而项目用的编码为utf-8,所以传中文会出现乱码。 这里我使用了注解来解决: @...

    iLink:拉丁云代码测试Spring MVC

    spring-mvc.xml 配置自动扫描的包、配置视图解析器 如何把 handler方法返回值解析为实际的物理视图、配置静态资源映射静态资源交给默认的Servlet、配置 mvc:annotation-driven标签开启注解(4)@RestController =@...

    乐优商城.xmind

    @ResponseBody可以直接返回Json结果 不仅可以返回json结果,还可以定义返回的HttpHeaders和HttpStatus service @Service 自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了 @Autowired ...

Global site tag (gtag.js) - Google Analytics