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一种返回类型只能用一个。
分享到:
相关推荐
在开发Web应用时,我们经常会遇到一个问题:当使用Spring MVC的`@ResponseBody`注解将后端处理结果直接转化为HTTP响应体时,如果这个结果中包含HTML特殊字符,如尖角号、引号、按位与符号等,浏览器可能会误解析,...
本文将深入探讨"类似Spring Controller注解Demo"这一主题,结合提供的标签"源码"和"工具",我们将分析Spring MVC中的Controller注解以及如何通过源码理解和应用它们。 Spring MVC是Spring框架的一部分,它提供了...
在Spring MVC框架中,使用`@ResponseBody`注解可以方便地将控制器方法的返回值转换为JSON格式,然后发送到客户端。本篇文章将详细介绍如何在Spring MVC的XML配置中设置,以便让`@ResponseBody`自动将Java对象转换为...
spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法 在使用 Spring+Mybatis 框架时,经常会遇到一个问题,就是通过 @ResponseBody 返回结果时,中文字符会出现乱码的问题。这是因为在 Spring MVC 中,...
它基于模型-视图-控制器(MVC)设计模式,其中Controller接收请求,Model处理数据,而View负责展示结果。在Spring MVC中,Controller类通常使用@Controller注解标识,并且可以包含多个处理请求的方法,这些方法通过@...
在Spring MVC框架中,开发者经常遇到ResponseBody返回的字符串出现乱码的问题,特别是当字符串中包含中文字符时。这是因为Spring MVC默认使用了StringHttpMessageConverter来处理Response Body中的字符串,而这个...
最近公司项目出现这样一个...在spring框架下,可以利用ResponseBodyAdvice接口,实现该接口则能够在声明了ResponseBody注解的controller返回json数据前,统一对json数据做处理,将资源地址的url统一替换为cdn资源url。
例如,下面是一个简单的Controller示例,展示了如何使用`@RequestMapping`和`@ResponseBody`处理GET请求并返回JSON数据: ```java import org.springframework.web.bind.annotation.*; @RestController public ...
-- @ResponseBody() spring-mvc 3 xml 配置--> <!--处理 @ResponseBody 中文乱码问题 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> ...
本篇文章将深入探讨Spring MVC Controller层中的常用注解,帮助开发者更好地理解和运用这些注解来构建高效、可维护的Web应用。 1. `@Controller`:这是最基本的注解,表明一个类是Spring MVC的Controller。它通常...
1. **Controller 概念**:Controller 是 MVC 设计模式中的关键组件,负责接收来自客户端的请求,处理业务逻辑,并将结果转发给视图层展示。在 Spring MVC 中,Controller 通常是一个实现了 `org.springframework.web...
在Spring MVC中,可以配置ResponseBody和RequestBody注解,使得控制器方法可以直接返回JSON数据或接收JSON输入。 5. **SPRING压缩包文件**:提到的"SPRING"可能包含Spring框架的所有必需jar包,如spring-context、...
Spring MVC可以通过配置,将Controller的返回结果转化为JSON格式,方便前端JavaScript处理。 在"SpringDataDemo"这个项目中,我们可以期待看到以下的配置和代码示例: 1. `pom.xml`文件会包含Spring、Spring MVC、...
- Service完成后,将结果返回给Controller。 - Controller将结果转换为JSON格式,通过`@ResponseBody`返回给前端。 - 前端接收到数据后,更新UI。 这个项目案例对于初学者来说,是一个很好的实践平台,可以帮助理解...
在Spring MVC框架中,Controller是处理用户请求的核心组件。这篇"Spring MVC 学习笔记 七 controller中其他可用的annotation"可能涵盖了除我们常见的`@RequestMapping`之外的其他注解,这些注解使得控制器功能更加...
总结来说,Spring MVC中处理Controller的字符编码问题主要是通过设置响应的`Content-Type`,使用`@RequestMapping`的`produces`属性,或者直接操作`HttpServletResponse`来指定字符集。同时,了解如何使用不同的参数...
例如,你可以创建一个接受POST请求的方法,该方法使用`@RequestBody`接收JSON数据,并用`@ResponseBody`返回结果。 ```java import org.springframework.web.bind.annotation.*; @RestController public class ...
这里的`@ResponseBody`注解表示返回的结果将直接写入HTTP响应体,而不是被视图解析器解析。 3. **编写jQuery AJAX**:在前端HTML页面中,使用jQuery的`$.ajax`方法发起请求。例如,向刚才创建的Controller发送POST...
本文将详细解析Spring MVC Controller支持的多种返回值类型,以及它们各自的用法。 1. ModelAndView `ModelAndView`是Spring MVC提供的一种组合模型数据和视图的类。它允许开发者同时指定视图名称和模型数据。例如...
- `@Controller`:标记类为Spring MVC的Controller。 - `@Service`和`@Repository`:配合`@Autowired`进行依赖注入,常用于Service和DAO层。 - `@ResponseBody`:将方法返回值直接写入HTTP响应体。 - `@...