在SpringMVC中可以在Controller的某个方法上加@ResponseBody注解,表示该方法的返回结果直接写入HTTP response body中。
但是实际使用中发现最后生成的response中"Content-Type"的值不正确。
Spring使用AnnotationMethodHandlerAdapter来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
AnnotationMethodHandlerAdapter使用request
header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入
response的"Content-Type"。
一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。
Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8生成的值为application/x-ms-application, image/jpeg,
application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap,
application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, */*
所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。
但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。
但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。
判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)
所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。
通过上面的分析,@ResponseBody看来是无法使用了。
分享到:
相关推荐
在Spring MVC框架中,`@RequestBody` 和 `@ResponseBody` 是两个非常重要的注解,它们在处理HTTP请求和响应时起到了关键作用。本篇文章将详细解释这两个注解的工作原理、使用场景以及如何实现Java对象与XML/JSON数据...
在Spring MVC框架中,`@RequestBody` 和 `@ResponseBody` 是两个非常重要的注解,它们在处理HTTP请求和响应时起到了关键作用。这篇博客将深入探讨这两个注解的工作原理以及如何利用它们实现在Java对象与XML或JSON...
描述中提到的"springmvc进行Jason数据封装转化时可以即使用也是@responsebody",指的是在Spring MVC的控制器(Controller)中,我们可以使用`@ResponseBody`注解配合Jackson库,实现将Java对象直接转换为JSON格式的...
在开发Web应用时,我们经常会遇到一个问题:当使用Spring MVC的`@ResponseBody`注解将后端处理结果直接转化为HTTP响应体时,如果这个结果中包含HTML特殊字符,如尖角号、引号、按位与符号等,浏览器可能会误解析,...
@ResponseBody 和 @RequestBody 注解的区别 在 Spring 框架中,@ResponseBody 和 @RequestBody 是两个常用的注解,它们都用于处理 HTTP 请求和响应,但是它们的作用和使用场景却有所不同。 一、@ResponseBody 注解...
本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`produces`属性来指定响应内容的MIME类型和字符集。例如: ```java @RequestMapping...
RequestResponseBodyMethodProcessor 是 Spring 框架中的一个处理器,用于处理 @ResponseBody 注解的方法。 在 RequestResponseBodyMethodProcessor 中,有一个重要的方法是 handleReturnValue,该方法用于处理...
在Spring MVC 4.x版本中,开发者可以使用@ResponseBody注解来简化控制器层向客户端返回JSON格式数据的过程。 ### @ResponseBody注解使用方法 @ResponseBody注解可以作用于方法上,它会指示Spring MVC框架将该方法...
在Spring MVC框架中,`@ResponseBody`是一个非常关键的注解,它用于处理HTTP请求的响应数据,并将其直接转换为HTTP响应体中的内容。这个注解通常与控制器(Controller)方法一起使用,允许我们将Java对象直接序列...
总之,`@ResponseBody`、`@RequestBody`和`@PathVariable`是Spring MVC中不可或缺的三大注解,它们在构建RESTful服务时起着至关重要的作用。掌握它们的用法和工作原理,能够提升我们的开发效率,使我们更好地利用...
标题中的“Spring MVC – Easy REST-Based JSON Services with @ResponseBody”是指使用Spring MVC框架构建基于REST的JSON服务,并通过使用`@ResponseBody`注解来简化这一过程。REST(Representational State ...
2.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,...
例如,在控制器中,我们可以使用@ResponseBody注解来将方法的返回值序列化为JSON格式。 ```java @RequestMapping("/testResponseBody") @ResponseBody public String testResponseBody() { return "Hello, World!";...
下面是@ResponseBody注解的详细作用: 1. 将controller方法的返回值转换成HTTP响應体。 2. 根据HTTP响應头中的Content-Type类型选择合适的HttpMessageConverter来进行数据转换。 3. 如果响應体中的数据是JSON格式,...
六、@RequestBody和@ResponseBody注解 这两个注解配合使用,可以将HTTP请求体中的数据自动转换为Java对象,或者将方法返回的对象转换为HTTP响应体。@RequestBody用于接收POST请求中的JSON或XML数据,而@ResponseBody...
在Spring MVC中,`@ResponseBody`注解就是依赖于`ObjectMapper`进行JSON序列化和反序列化的。 - **jackson-core**:这个模块提供了基础的JSON读写功能,如流式处理、解析器和生成器,是其他Jackson模块的基础。 - ...
@RestController 注解是一个组合注解,相当于 @Controller 和 @ResponseBody 的合集。它表示当前类是一个控制器类,并且该控制器类的方法返回值将直接写入 HTTP 响应体中。 4. @Autowired @Autowired 注解表示自动...
@ResponseBody注解可以在类上或方法上使用,用于设置当前类或方法响应的内容。 7. MyBatisPlus的应用 MyBatisPlus提供了一个简洁的CRUD操作接口,支持Lambda表达式、自动填充、逻辑删除、数据库字段加密、条件构造...
在上面的代码中,我们使用了@Controller注解来标识HospitalController类,然后使用@RequestMapping注解来标识findAllHospital方法,并使用@ResponseBody注解来标识方法返回的结果是JSON对象。 相比之下,@...