`
kobe学java
  • 浏览: 249925 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

 
阅读更多

 

 

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

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

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

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

代码

按照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的编写,这里就不详说了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics