springmvc rest框架搭建中遇到的问题(一)

 

 

在搭建springmvc的rest框架的过程中遇到了很多问题,终于算是解决了。

用的是spring3+mybatis3,换成hibernate也差不多。 主要的配置网上很多,在这里参照了rapidframework里面的demo

 
  
< bean class ="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" ></bean>

一开始,只是支持text/html和application/json都没问题,当加上了application/xml就碰到了很多问题

代码
 
   
< bean class ="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" >
< property name ="ignoreAcceptHeader" value ="true" />
< property name ="defaultContentType" value ="text/html" />
< property name ="mediaTypes" >
< map >
< entry key ="json" value ="application/json" />
< entry key ="xml" value ="application/xml" />
</ map >
</ property >
< property name ="favorParameter" value ="false" />
< property name ="viewResolvers" >
< list >
< bean class ="org.springframework.web.servlet.view.BeanNameViewResolver" />
< bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name ="viewClass" value ="org.springframework.web.servlet.view.JstlView" />
< property name ="prefix" value ="/pages" />
< property name ="suffix" value =".jsp" ></ property >
</ bean >
</ list >
</ property >
< property name ="defaultViews" >
< list >
<!-- for application/json -->
< bean class ="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<!-- for application/xml -->
< bean class ="org.springframework.web.servlet.view.xml.MarshallingView" >
< property name ="marshaller" >
< ref bean ="xstreamMarshaller" />
</ property >
</ bean >
</ list >
</ property >
</ bean >

按照spring的reference,先用了xstreamMarshaller来解决beantoxml

1:使用xstream的bean转xml,格式有问题

执行了rapidframework的那个demo,bean转xml是正常的,到了我这里怎么老是有问题,类的名字一长串,还包含$$enhanced_cglib 字样

于是查找原因,结果因为rapid的demo里使用了自己封装过的ibatis3,而我使用了mybatis以及mybatis-spring,取出来的bean都是cglib的代理类,转成xml后,里面都包含$$enhanced_cglib  这样的类,怎么都去不掉。

网上查找了下,发现使用hibernate存在同样的问题,但xstream没有很好的解决方案。

另一个不使用xstream的原因是,无法对生成的xml进行定制,虽然可以在bean上进行annotation标注,但我不希望bean中带入xstream的东西。

于是,改使用另一个beantoxml的工具 castorMarshaller,他定制xml的方式还行。但发现转成xml是同样的问题,无法正确识别cglib,而且更夸张。

解决办法一:在spring的org.springframework.web.servlet.view.xml.MarshallingView中修改bean类,把cglib代理类处理成其父类,即原始的bean。

结果:面对bean是没问题了,但如果是collection或者这个bean的属性里有collection,这样处理太麻烦了,效率也很低。

解决办法二:改用ibatis2,这个当然没问题了,作为一个版本使用吧。

解决办法三:看看castor有没有解决办法,官网上一搜,果然有

2.使用castorMarshaller处理beantoxml

(使用的是castor-xml的1.3.1版本)

在src目录创建castor.properties,里面加入如下内容:

 

 
  
org.exolab.castor.xml.proxyInterfaces = net.sf.cglib.proxy.Factory , org.hibernate.proxy.HibernateProxy

 

 

 但是按照官网设置,死活不起作用。于是就debug源代码,发现源代码果然有bug:配置文件读取进来了,但是类里面的proxyInterfaces始终没有被赋值。

网上继续搜这个问题,答案在这里http://jira.codehaus.org/browse/CASTOR-2880

按照这个说法,要么这么调用

 
  
Marshaller m = context.createMarshaller();
m.setInternalContext(m.getInternalContext());

但我是spring配置的,不好这么做,

要么把里面的补丁弄下来,试了下,没弄好,也没更多的时间花在这个上面研究。

网上找了资料,老外说1.2版本解决代理类的问题是好的,到了1.3.1反而不行了。。。看来老外的测试也做得不咋样

哎,于是换回castor的1.2版本,普通的bean和collection的wrapper bean,一切都ok

同时也学习了一下castor对于定制xml,需要增加个mapping文件,里面包含了bean和collection的配置,以及时间等个性化convertor的编写,这里就不详说了。

 

转载于:https://www.cnblogs.com/monolithic/archive/2010/11/20/1882808.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值