- 浏览: 958177 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
以StringHttpMessageConverter为例。
@RequestMapping("/rb") @ResponseBody public String locale() { User user = new User(); user.setId(1); return user.toString(); }
对于这个代码,结果和浏览器有关系。
Firefox的accpet是
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
google chrome则是
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
而结果则也不相同。
firefox
google chrome
为什么会这样呢?
调试
<mvc:annotation-driven />开启了之后它给AnnotationMethodHandlerAdapter初始化7个转换器。
当发现一个方法上面有@ResponseBody注解,就调用Adapter的handleResponseBody方法。AnnotationMethodHandlerAdapter的方法:
private void handleResponseBody(Object returnValue, ServletWebRequest webRequest) throws Exception { if (returnValue == null) { return; } HttpInputMessage inputMessage = createHttpInputMessage(webRequest); HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); writeWithMessageConverters(returnValue, inputMessage, outputMessage); } 实际处理的是writeWithMessageConverters(returnValue, inputMessage, outputMessage);这句 private void writeWithMessageConverters(Object returnValue, HttpInputMessage inputMessage, HttpOutputMessage outputMessage) 方法: 首先是取出List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();请求中的accept信息。 这里取出来后,会遍历每个acceptedMediaTypes ,看有没有转换器能处理这个accpet。 随后有代码 for (HttpMessageConverter messageConverter : getMessageConverters()) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { 这是遍历每个转换器,检查是否可以使用这个转换器处理。 StringHttpMessageConverter的canWrite被没有重写,而是使用AbstractHttpMessageConverter已经写好的canWrite方法。 public boolean canWrite(Class<?> clazz, MediaType mediaType) { return supports(clazz) && canWrite(mediaType); } 其中supports方法是 public boolean supports(Class<?> clazz) { return String.class.equals(clazz); } 而canWrite(mediaType);则是 protected boolean canWrite(MediaType mediaType) { if (mediaType == null || MediaType.ALL.equals(mediaType)) { return true; } for (MediaType supportedMediaType : getSupportedMediaTypes()) { if (supportedMediaType.isCompatibleWith(mediaType)) { return true; } } return false; } 它支持的格式有getSupportedMediaTypes()决定了。AbstractHttpMessageConverter默认的支持所有accpet。 直接请求过去的accpet内容当然是支持的。 回到writeWithMessageConverters方法,如果canWrite为true,下面则是 messageConverter.write(returnValue, acceptedMediaType, outputMessage); 进入,StringHttpMessageConverter还是没有重写过,使用AbstractHttpMessageConverter的方法。 HttpHeaders headers = outputMessage.getHeaders(); if (headers.getContentType() == null) { 判断回应头信息是否为空,空的话接下去,会判断acceptedMediaType(请求的accpet中的一个),如果可以处理,则将回应的accpet也设置为请求的accpet。否则为默认的(text/plain)。
因此可以看出问题出在这里。因为请求的accpet遍历是从第一个开始的。google chrome的accpet application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5第一个是 application/xml
回应的head accpet则也是 application/xml,return的信息不符合xml规范。
而firefox 的head accpet是
Content-Type text/html;charset=UTF-8
设置为text/html,所以答应出一个字符串当然没问题了。
评论
2 楼
liyixing1
2012-11-09
sjbrising 写道
spring mvs的源码都看过吧。分析的很细致啊。
嗯看过一部分而已
1 楼
sjbrising
2012-10-25
spring mvs的源码都看过吧。分析的很细致啊。
发表评论
-
Spring 定时任务,cron表达式,@Scheduled cron表达式
2016-04-25 15:48 5296一个cron表达式有至少6 ... -
spring mvc list
2015-12-14 10:28 1284我使用这样无法传入 @requestMapping(" ... -
Unable to locate Spring NamespaceHandler for XML schema namespace
2015-09-23 14:00 2322org.springframework.beans.facto ... -
关于使用s.url jstl的上下文
2015-08-16 13:28 917比如 [@s.url '/'/]index.html?cote ... -
Spring 属性占位符配置器 PropertyPlaceholderConfigurer
2015-08-02 12:43 2082<!-- 属性配置文件读 ... -
FactoryBean接口
2014-09-30 14:05 908实现了FactoryBean接口的bean不是简单的一个bea ... -
国际化之MessageSourceAware和MessageSourceAccessor
2014-01-06 23:13 2853先看接口MessageSourceAware 该接口的注释中 ... -
spring 惯例优先原则
2013-07-22 09:46 1211惯例优先原则(convention over configur ... -
ant path匹配
2013-07-22 09:40 2174spring和ant path实现相关的主要类有两个 org. ... -
springmvc action方法中参数具有@ModelAttribute与不具有的区别
2012-12-14 09:36 4114在springmvc的参数解析中,发现具有@ModelAttr ... -
util包
2012-12-05 13:50 1107spring的util基本上都在springframework ... -
url,请求相关帮助类UrlPathHelper
2012-11-29 11:18 2519org.springframework.web.util.Ur ... -
整站国际化方案
2012-11-28 17:46 1108当前常见的实现方式,主要由两种方案实现 1.通过locale ... -
spring的三种注入方式
2012-11-20 17:30 18671.通过bean的property子元 ... -
spring AnnotationUtils 注解工具
2011-12-08 11:27 1302spring AnnotationUtils 注解工具 -
GenericCollectionTypeResolver,用于获取list或者map等元素的类型
2011-12-07 16:17 1311GenericCollectionTypeResolver,用 ... -
属性编辑器
2011-12-05 18:19 1079我自定义了一个类型,然后设置了一个属性编辑器,注册的class ... -
iframe下面的session问题
2011-12-04 19:52 5320在写iframe完成长连接获取上传状态的时候,有两次请求,一次 ... -
mvc之类的驱动原理
2011-12-01 09:34 1097<mvc:annotation-driven /> ... -
Couldn't access current invocation
2011-10-20 20:44 1895做了一个aop的日志记录器,但是在运行的时候出现了日志信息 服 ...
相关推荐
在开发 RESTful Web 服务时,Spring MVC 的 HttpMessageConverter 是一个至关重要的组件。这个功能允许我们将 Java 对象转换为 HTTP 响应消息,并将 HTTP 请求消息解析为 Java 对象。本文将深入探讨如何利用 Spring ...
在Spring MVC框架中,`MappingJackson2HttpMessageConverter`是一个至关重要的组件,它负责将Java对象转换成JSON格式的数据,并且能将接收到的JSON数据转换回对应的Java对象。这个类是Spring对Jackson库的集成,使得...
SpringMVC源码剖析(五)- 消息转换器HttpMessageConverter1 在SpringMVC中,有一个非常重要的机制,即消息转换器HttpMessageConverter,它负责将HTTP请求和响应报文转换为Java对象和反之。为了更好地理解这个机制...
默认情况下,Spring MVC使用`HttpMessageConverter`来完成这个转换,其中最常用的转换器是`MappingJackson2HttpMessageConverter`,它依赖于Jackson库来序列化对象为JSON。 接下来,我们将探讨如何实现JSON数据的...
在处理 HTTP 消息转换时,FastJson 提供了 FastJsonHttpMessageConverter 类,该类允许开发者自定义 JSON 序列化和反序列化的属性,以满足特定的需求。以下是 FastJson 属性的一些详细说明: 1. **QuoteFieldNames*...
其中,`MappingJackson2HttpMessageConverter`是处理JSON的主要转换器,它使用Jackson库进行序列化。 - Jackson提供了配置选项来自动进行HTML转义。可以通过配置`ObjectMapper`来实现,例如: ```java ...
Spring HttpMessageConverter 的作用及替换解析 Spring HttpMessageConverter 是 Spring 框架中的一种机制,用于将 HTTP 请求和响应报文与 Java 对象之间进行转换。它通过实现 HttpMessageConverter 接口来完成这种...
SpringMVC源码解析之消息转换器HttpMessageConverter SpringMVC中的消息转换器HttpMessageConverter是实现请求报文和对象、对象和响应报文之间的自动转换的关键机制。该机制通过使用@RequestBody和@ResponseBody两...
在这个过程中,`RequestMappingHandlerAdapter`和`HttpMessageConverter`两个组件起着至关重要的作用。 `RequestMappingHandlerAdapter`是Spring MVC中的一个适配器,它的主要职责是将请求映射到处理器方法...
SpringBoot基于HttpMessageConverter实现全局日期格式化 在 SpringBoot 框架中,日期格式化是一个非常重要的主题。作为一名开发者,我们经常会遇到日期格式化的问题,例如如何将日期字符串解析成 Date 对象,或者...
本文将深入探讨HttpMessageConverter的工作原理以及如何解决415错误。 首先,让我们了解问题的背景。在SpringMVC中,如果使用`@RequestBody`注解来接收POST请求中的参数,那么Spring会依赖于已配置的...
spring Android中MappingJackson2HttpMessageConverter()需要此包和jackson-annotations-2.2.3.jar和jackson-databind-2.2.3.jar
使用FastJsonHttpMessageConverter,提高JSON序列化速度 集成MyBatis,通用Mapper插件,PageHelper分页插件,实现单表业务零SQL 使用SpringFox-Swagger2管理API文档 使用lombok简化POJO 提供代码生成器根据表名生成
接下来,在Spring MVC的配置文件(如`springMVC.xml`)中,替换原来的`FastJsonHttpMessageConverter`实例为我们的自定义类`JsonHttpMessageConverter`,并设置支持的媒体类型及序列化特性: ```xml <!-- 替换...
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_...
首先,关于FastJson库的版本问题,官方文档指出,从版本1.2.10开始,FastJson提供了两个用于HttpMessageConvert的方法,分别是FastJsonHttpMessageConverter和FastJsonHttpMessageConverter4。这两个方法分别支持...
为了返回JSON响应,只需在控制器方法中返回Java对象,Spring MVC会自动调用合适的HttpMessageConverter(如`MappingJackson2HttpMessageConverter`)将对象转换成JSON字符串,并设置响应内容类型为`application/json...
2. 然后,Spring MVC会使用选择的HttpMessageConverter来将请求体中的数据解析成对应的Java对象。 3. 最后,Spring MVC会将解析后的对象绑定到controller方法的参数上。 @ResponseBody注解 @ResponseBody注解主要...
- Spring MVC默认提供了多种Converter,例如:StringHttpMessageConverter(处理字符串)、MappingJackson2HttpMessageConverter(处理JSON数据)、Jaxb2RootElementHttpMessageConverter(处理XML数据)等。...
MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter; ObjectMapper objectMapper = jsonConverter.getObjectMapper(); SimpleModule module = new Simple...