Spring MVC 3.x 消息转换器

来源:互联网 发布:手机人工智能有什么用 编辑:程序博客网 时间:2024/05/22 05:01

RESTFul或Ajax都是根据一个合约(固定的文件扩展名或Http请求头的Accept)来获得某种格式的数据响应.

图1

不用消息转换器也可以实现.来看一看以下示例

    @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<实体>或其它集合)即可

上面的配置是用扩展名来识别消息转换器.测试如下图

图2

如果希望用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>

该方案需要多一些依赖

0 0
原创粉丝点击