Spring MVC 3.x 消息转换器
来源:互联网 发布:手机人工智能有什么用 编辑:程序博客网 时间:2024/05/22 05:01
RESTFul或Ajax都是根据一个合约(固定的文件扩展名或Http请求头的Accept)来获得某种格式的数据响应.
不用消息转换器也可以实现.来看一看以下示例
@RequestMapping(value="/favorite",method=RequestMethod.POST,produces = "application/json; charset=utf-8") @ResponseBody public String favoriteArticle(@RequestParam String hash){ if(!aO.isOnline()) return "{}"; TipMessage msg=null; if( articleService.addFavorite(hash, aO.getUid())){ msg=new TipMessage("收藏成功",TipMessageLevel.ACC); }else{ msg=new TipMessage("已经完成收藏"); } //使用某个Json框架把对象转换成String return msg.showJson(); }
对于xml内容的响应不用消息转换器也可以实现.最简单的是用JAXB,把一个把对象转换成String.
如果这种需求在项目中大量出现,你可以把他们归到一个WEB服务项目,使用Jersey框架或其它的WEB服务框架来实现,如果还至于把他们归到一个项目.哪看看Spring MVC的消息转换器吧.
spring mvc配置文件
<!-- 开启Spring mvc 注解支持 --> <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"> <mvc:message-converters register-defaults="true"> <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" /> </bean> <!-- 将Jackson2HttpMessageConverter的默认格式化输出为false --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> <property name="prettyPrint" value="false" /> <property name="objectMapper"> <bean class="net.labdemo.common.mapper.JsonMapper"></bean> </property> </bean> <!-- 使用 Spring 的 marshaller/un-marshaller 读取/编写 XML 数据,转换媒体类型为 application/xml 的数据 --> <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <constructor-arg ref="jaxb2Marshaller" /> <property name="supportedMediaTypes"> <list> <value>text/xml;charset=UTF-8</value> <value>application/xml;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- JAXB to XML --> <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <!-- 按命名包扫描 --> <property name="packagesToScan" value="net.labdemo.entity"></property> <!-- 按命名类扫描 --> </bean> <!-- 根据URL后缀自动判定Content-Type及相应的View --> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="mediaTypes"> <map> <entry key="xml" value="application/xml" /> <entry key="json" value="application/json" /> </map> </property> <property name="ignoreAcceptHeader" value="true" /> <property name="favorPathExtension" value="true" /> </bean>
只贴出了与消息转换器有关的配置.配置中用到的jar,下面是maven
<!-- http://mvnrepository.com/artifact/org.springframework/spring-oxm --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- http://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream --> <!-- 不启用xstream可以删除 --> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.7</version> </dependency> <!-- http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!-- http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <!-- http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>${jackson.version}</version> </dependency>
net.labdemo.common.mapper.JsonMapper在此文的附件中可以下载到,用了fasterxml.Spring MVC控制器中的方法只需要加上:@ResponseBody注解,方法的返回值直接写类型(实体,List<实体>或其它集合)即可
上面的配置是用扩展名来识别消息转换器.测试如下图
如果希望用Http请求头的Accept来识别消息转换器.contentNegotiationManager Bean作以下变更(图1就是以下配置的截图)
<!-- REST中根据URL后缀自动判定Content-Type及相应的View --> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="ignoreAcceptHeader" value="false" /> <property name="favorPathExtension" value="true" /> </bean>
最后
1.
net.labdemo.entity包下的实体是需要加Jaxb注解的.关于注解的说明参考
jaxb中的类继承
2.
Spring MVC+Spring的基础配置文件参考
Spring Mvc+Spring+Mybatis(SSM)基础配置文件
3.
使用Jersey架设RESTFul服务
jersey服务端简单小示例
4.
JsonMapper源码
5.
对于xml消息转换器还可以使用:XStreamMarshaller
示例:
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <constructor-arg> <bean class="org.springframework.oxm.xstream.XStreamMarshaller"> <property name="streamDriver"> <bean class="com.thoughtworks.xstream.io.xml.StaxDriver" /> </property> <property name="annotatedClasses"> <list> <value>net.labdemo.common.entity.BaseEntity</value> </list> </property> </bean> </constructor-arg> <property name="supportedMediaTypes" value="application/xml"></property> </bean>
该方案需要多一些依赖
- Spring MVC 3.x 消息转换器
- Spring MVC @JsonView实现在消息转换器中过滤数据
- Spring MVC处理JSON数据(3)-自定义消息转换器
- Spring MVC 转换器
- Spring MVC 创建自定义转换器
- Spring mvc 自定义时间转换器
- Spring mvc 自定义时间转换器
- spring MVC自定义日期转换器
- Spring mvc日期Date转换器
- spring MVC 转换器的使用
- Spring MVC自定义类型转换器
- Spring Boot JSON消息转换器
- [实践]Spring MVC——消息转换器的编码(防止中文乱码)
- Spring MVC使用fastjson做消息转换器,与默认Jackson的区别
- Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)
- spring mvc 3.x json
- Spring MVC 中,自动加载 JSON 转换器
- spring MVC (7) 定义自定义类型转换器
- 练习4-11 修改getop函数,使其不必使用ungetch函数。提示:可以使用一个static类型的内部变量解决该问题
- VirtualBox 安装 Mac OS 及全屏设置
- 学习使用的PL/0编译器增强版PL/0plusplusCompiler(七)扩展repeat-until
- C++学习写在前面
- Hadoop-2.7.2伪分布式集群搭建
- Spring MVC 3.x 消息转换器
- 关于解决/lib/ld-linux.so.2: bad ELF interpreter:
- swift基础判断网络连接
- Struts2整合Spring
- Apache安装
- Android 5.0学习之动画
- Win10 右键菜单添加文本编辑器的菜单项
- 确认(confirm 消息对话框)
- 关于http keep-alive与tcp keep-alive