Spring MVC REST内容协商

转自:http://cnge06.iteye.com/blog/1755856

Spring MVC REST内容协商(同一资源,多种展现方式,html、xml、json等,通过ContentNegotiatingViewResolver)


突然对ruby on rails来了兴趣,便捣弄了两天,用脚手架做了个hello world,实质上也就是一行命令的事,的确够效率。看一下Controller,其REST风格实在太简洁了。

 

Ruby代码   收藏代码
  1. # GET /posts  
  2. # GET /posts.json  
  3. def index  
  4.   @posts = Post.all  
  5.   
  6.   respond_to do |format|  
  7.     format.html # index.html.erb  
  8.     format.json { render json: @posts }  
  9.   end  
  10. end  

 一直在关注着spring,如今一般的web项目,从前到后几乎可以用spring直接搞定了。因此,对spring mvc及REST相关内容自然也有所了解。

 

 

于是今天就在想,spring mvc应该也可以对同一资源,实现多种展现才是,前提当然是在同一个方法里。(之前是为json的处理单独写一个Controller的method的,倒也没什么问题。)

就如以下:

 

Java代码   收藏代码
  1. @RequestMapping(value={"/user/{id}","/user/{id}.json"})  
  2.     public ModelAndView show(@PathVariable(value="id")String id){  
  3.         User user=userService.get(Long.valueOf(id));  
  4.         ModelAndView mav=new ModelAndView("show");  
  5.         mav.addObject(user);  
  6.         return mav;  
  7.     }  

 

 当我请求/user/1时,便会回应show的视图,当我请求/user/{id}.json时,便会回应json格式的数据。

 

而spring mvc中ContentNegotiatingViewResolver便能满足这个需求,除了json,还有xml/rss。

 

相关资讯可查看这里(里面还对RESTful中同一资源多种表述进行描述的三种方式进行了讨论。)。

我当前使用spring版本是3.2,在这个版本里,对ContentNegotiatingViewResolver作了修改,原样参照以上链接配置,出现java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.http.MediaType 的异常。版本原因造成这个问题。

在springsource的论坛里有人询问和解答,请看这里或者这里

 

起作用的配置,例:

 

Java代码   收藏代码
  1. <!-- REST -->  
  2.     <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
  3.         <property name="order" value="1" />  
  4.         <property name="contentNegotiationManager">  
  5.             <bean class="org.springframework.web.accept.ContentNegotiationManager">  
  6.                 <constructor-arg>  
  7.                     <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">  
  8.                         <constructor-arg>  
  9.                             <map>  
  10.                                 <entry key="json" value="application/json"/>  
  11.                                 <entry key="xml" value="application/xml"/>  
  12.                             </map>  
  13.                         </constructor-arg>  
  14.                     </bean>  
  15.                 </constructor-arg>  
  16.             </bean>  
  17.         </property>  
  18.   
  19.   
  20.         <property name="defaultViews">  
  21.             <list>  
  22.                 <!-- JSON View -->  
  23.                 <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />  
  24.   
  25.                 <!-- XML View -->  
  26.                 <bean class="org.springframework.web.servlet.view.xml.MarshallingView">  
  27.                     <constructor-arg>  
  28.                         <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">  
  29.                             <property name="packagesToScan">  
  30.                                 <list>  
  31.                                     <value>documentLoader.domain</value>  
  32.                                 </list>  
  33.                             </property>  
  34.                         </bean>  
  35.                     </constructor-arg>  
  36.                 </bean>  
  37.             </list>  
  38.         </property>  
  39.     </bean>  
  40.   
  41.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  42.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
  43.         <property name="prefix" value="/WEB-INF/views/" />  
  44.         <property name="suffix" value=".jsp" />  
  45.     </bean>  
Java代码   收藏代码
  1. 仅作小记,如果刚好对他人有用就更好了。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值