随笔 - 115  文章 - 481  trackbacks - 0
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(19)

随笔档案(115)

文章档案(4)

新闻档案(1)

成员连接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  Spring是一个非常优秀的开源项目,然而,跟其它任何优秀的系统产品一样,也存在着这样那样的问题,我们喜欢称为Bug。Spring中的Bug确实不少,今天为了充实“中文问题没商量”主题,举一个不算很重要,也比较简单理解的一个Bug示例。
  这里提前申明,这个话题不是针对Spring项目,因此请“春迷”们自重、没事勿扰,文中不足之处欢迎大家批评指教。
  我们知道,一个开源软件项目,给用户的单元测试最基本的要求是能全部通过测试,在Java中就是在运行单元测试的时候应该要看见一个绿条。Spring项目的单元测试写得非常好,也非常全面。然而,单元测试中却有一些问题,在中文路径上无法完全通过测试,必须放到英文路径下才能完全通过测试,因此,这属于一种“没商量”的中文问题。
  单元测试:
  包:org.springframework.beans.factory.xml
  类:XmlBeanFactoryTests
  方法:testFileSystemResourceWithImport
  错误图示:
 


  详细错误信息:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml]; nested exception is java.io.FileNotFoundException: C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml (系统找不到指定的路径。)
Caused by: java.io.FileNotFoundException: C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml (系统找不到指定的路径。)
 at java.io.FileInputStream.open(Native Method)
 at java.io.FileInputStream.<init>(FileInputStream.java:106)
 at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:85)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:315)
 at org.springframework.beans.factory.xml.XmlBeanFactory.<init>(XmlBeanFactory.java:73)
 at org.springframework.beans.factory.xml.XmlBeanFactory.<init>(XmlBeanFactory.java:61)
 at org.springframework.beans.factory.xml.XmlBeanFactoryTests.testFileSystemResourceWithImport(XmlBeanFactoryTests.java:946)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at junit.framework.TestCase.runTest(TestCase.java:154)
 at junit.framework.TestCase.runBare(TestCase.java:127)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:118)
 at junit.framework.TestSuite.runTest(TestSuite.java:208)
 at junit.framework.TestSuite.run(TestSuite.java:203)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

测试代码:
public void testFileSystemResourceWithImport() {
  String file = getClass().getResource("resource.xml").getFile();
  XmlBeanFactory xbf = new XmlBeanFactory(new FileSystemResource(file));
  // comes from "resourceImport.xml"
  ResourceTestBean resource1 = (ResourceTestBean) xbf.getBean("resource1");
  // comes from "resource.xml"
  ResourceTestBean resource2 = (ResourceTestBean) xbf.getBean("resource2");
 }
 
出错原因:
  这个问题是笔者在参与开发EasyJWeb及EasyDBO框架中遇到过的问题,因此很容易就找到了问题的所在。Java的Class.getResource(name)返回的是一个URL,而URL.getFile默认情况下返回的是经过URL编码后的字符,会把中文等特殊字符变成类似%e6的形式。而一般io构造路径是没有自动解码功能的,所以在中文路径下要出现错误。
 
解决办法:
  在使用URL.getFile返回的路径时,使用前需要使用java.net.URLDecoder对路径进行一次解码操作。修改后的且能通过测试的方法如下:
public void testFileSystemResourceWithImport() {
  String file = getClass().getResource("resource.xml").getFile();
  try{
  file=java.net.URLDecoder.decode(file,"UTF-8");
  }
  catch(Exception e)
  {
   e.printStackTrace();
  } 
  XmlBeanFactory xbf = new XmlBeanFactory(new FileSystemResource(file));
  // comes from "resourceImport.xml"
  ResourceTestBean resource1 = (ResourceTestBean) xbf.getBean("resource1");
  // comes from "resource.xml"
  ResourceTestBean resource2 = (ResourceTestBean) xbf.getBean("resource2");
 }
 
小结:
  由于Spring开源项目的开发团队中,除了一些喜欢跟在Rod大叔的屁股后面唱中文版赞歌的“春迷”以外,当前似乎还没有中国人参与到正式的Spring开发小组中。因此,也许没有在中文路径下运行过测试用例,导致我这样的Spring初学者一不小心就遇上这样的问题。
  问题是解决了,但是却是一种比较罕见的方式,而且Spring开发小组事先也许没有预想到或是故意忽略掉的问题,因此,可以称得上是“没商量”的中文问题。
   (注:本文作者,EasyJF开源团队 大峡,转载请保留作者声明!)
posted on 2006-08-21 11:45 简易java框架 阅读(2213) 评论(30)  编辑  收藏

FeedBack:
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 13:16 杨一
在使用spring之前,我曾自己设计了一个配置的树形结构,来管理配置我的web企业应用项目。但后来接触了spring我才发现这是我想要的东西。还有orm的思想也是,很多人都曾经这么实践过。有了更好的东西,我们为什么不用呢,我需要一个配置树,但我的配置树却不支持依赖注入。在我有时间和能力做出更好的东西或发现更好的东西以前,只能用spring了。
至于您说的spring的bug,我只想说一句话,您参与了windows或linux的开发了吗?  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 16:39 nononone
这个问题明显是URL不支持中文造成的,怎么算是“Spring2.0项目中的Bug一例 ”呢?你觉得这个问题应该由Spring来解决吗?

BTW:俺不是“春迷”,请楼主不要神经过敏对号入座。  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 17:40 鬼扯
鬼扯  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 21:01 建议找本xml的入门读物
倒!!!!!!居然直接把UTF-8写到程序里面去了............
mmwy的是正解,你要在xml中使用UTF-8字符,至少这个文件的编码格式.否则,就只能使用这种硬编码方式
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 21:02 建议找本xml的入门读物
上文漏字,应该是:
至少在开头指明这个文件的编码格式

  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 22:10 也来侃侃
  有点意思,难道上面几位就是大峡说的传说中的春迷吗?我刚才试了一下,确实有这个问题,要是Spring的开发小组看了也一定会虚心改正的啊,我们在这里没必要为此受不了啊。
  BTW:“建议找本xml的入门读物”,不懂就别装了好不,这个不关什么XML格式的,是JDK中URL类的问题,希望多看到这样的文章!
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 23:07 建议找本xml的入门读物

你也知道是jdk中的URL类的问题。URL.getFile()不是在默认情况下返回经过URL编码后的字符,而是所有情况下都这样。
把UTF-8硬编码到程序里面,windows系统下是搞定了,因为windows的内码天生就是unicode的,别的系统下面试一试?
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-21 23:36 也来侃侃
@建议找本xml的入门读物
我看作者说确实也是Spring项目问题之一啊,难道你不觉得吗?没必须跑题吧!  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 00:17 建议找本xml的入门读物
和spring其实不搭界。
这个补丁不是应当spring来打,而是java消除平台无关性的时候做的.像楼主那样打补丁,只能说是拆了西墙补东墙.
打个比方,某家前门锁坏了,隔三岔五进小偷,没办法,只能把后门的锁拆下来装到前门。  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 00:42 也来侃侃
我又来了,PS“建议找本xml的入门读物”,我看作者的意思只是举了一个例子吧,“拆了西墙补东墙. ”,不补连运行都运行不起,不管怎么说,补了比没补好。当然,你要能否拿出一个不需要补的完美方案来呢,有的话不妨拿出来我也学习学习。谢谢作者让我长了见识,刚刚特意去他们网站看了一下,发现这是一个很有活力的团队,东西有点多,过几天再好好看看。这里希望你也能拿出一些东西来让我长点见识。
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 09:52 建议找本xml的入门读物
需要解决方案么?
搞那么多中文目录干吗? 就像以前有个哥们自己搞了一个什么中文编程一样.自己找切么。
写程序就写程序好了,玩那么多花活干什么. 英文不认识就好好去补英文。也许有人更加喜欢这种:
如果 五 大于 三 那么
打印 "你好,世界"
风格的?那就好好的去玩自己的轮子吧。那也是一片天地。
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 10:04 建议找本xml的入门读物
难道有活力就能改变干事情的性质。这个圈子里面最有活力的就是搞流氓软件的了。
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 10:06 也来侃侃
@建议找本xml的入门读物

  在我看来这个例子没有一个万能的解决方案的。但作者的例子应该能在windows下的任意操作系统下执行,比Spring项目小组的写法有所改进。另外,不知道是不是我们跑题了?好像人家是谈中文问题吧。
  对了,楼上的朋友那么瞧不起中文,不考虑中文用户的感受,不知道你孩子生下来是先教他喊“Dad”呢,还是喊“爸爸”,感觉楼上的很清高啊。
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 10:48 杨一
楼主在指出中文问题这件事情上是对的,大家就事论事。但总觉得把中文问题归罪给spring有些牵强,我举个例子:在工业革命早期,工人被剥削,不考虑推翻资本家,却去砸机器。如果你承认了狗皇帝,就不要抱怨地方官  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 11:30 建议找本xml的入门读物
别。选择性失明就是你的不对了
楼主明明谈的是spring项目中的中文问题,而且把这个归因于spring的bug,你倒好,直接泛化为中文问题了。
作为一般使用者,面对中文自然是合理要求,但作为程序员和系统开发者/管理者,在可控范围内弄出一大堆中文目录,那就是自己找切。怨不得别人。
还有,那个平台相关性是比一致性失败更加危险的动作。其实,要想只windows下玩,.NET是不二之选,玩java岂不是多此一举  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 14:23 春迷没救了
@杨一,@建议找本xml的入门读物
  我觉得他是指出了Spring中一些不严谨的地方。另外,我不完全赞同windows下.net是不二的选择这个说法,开发80%还是在windows下吧。好像也没有针对Spring吧,不是还有几篇吗?

  好好看看作者开篇语里面的原话,怎么你就只会为Spring辩护呢,我终于知道作者为什么要不厌其烦的提“春迷”,在我看来,春迷不是一群人,更像一种现象了!
  我帮你们摘过来:
  “这个主题会在我以后的工作遇到一个写一个,不断完善。“中文问题没商量”系列文章的目的除了把本人在工作及学习过程中遇到的一些中文问题拿来跟大家交流以外,一个重要目的是想抛砖引玉,希望能搜集更多的困扰我们的中文问题,欢迎大家把工作中所遇到的无法解决的中文问题提交到这个主题里面。”
  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 15:51 建议找本xml的入门读物
easyjf的难道只会扣帽子,naive,不要搞得象红卫兵那样。
前面的哥们不是说了么,这个和spring没关系,只是jdk的问题。我看楼主的标题不如改成"XXXX没商量"之jdk的bug,然后立志实现一个jdk,更牛气了
在windows下玩就是在windows下开发?别会错意了。在哪儿开发不重要,关键看部署。

  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 16:12 春迷没救了
我这么快也成什么easyjf的了,easyjf是作者所在的网站吧,看来easyjf还真可怜.......不知道楼上又是哪个jf的呢?  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 19:39 温柔一刀
路过  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 20:08 建议找本xml的入门读物
敢情easyjf们把贴标签当作自己的专利了?
贴别人的时候那么爽,被别人贴的时候就开始叫屈了,也太没品了巴  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 20:15 春迷没救了
@建议找本xml的入门读物
不想跟你说了,免得连累人家easyjf,建议自己好好去csdn看看春迷们的的精彩表演吧,还嫌不够丢人!  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-22 23:11 建议找本xml的入门读物
hehe.现在想撇清?来不及了。本来就是easyjf的马甲么,还连累不连累的。
就easyjf那个名声,早就那样了,难道还在乎谁比谁更丢人?  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-24 00:10 旁观者
说个跑题的话,很多人并不怀疑楼主的水平,你提出问题,并对自己的项目作出解决方案本身无可厚非,但是别人就不能质疑你结论吗?技术讨论是为了共同进步,不是辩论比赛,要拼命攻击对方表达中出现的漏洞,从而分出输赢的结果,技术并不是二元化的,不是非此即彼的。  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-08-30 15:43 little4
daxia总是能扔出搞笑的命题
芙蓉xiaxia  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-09-06 12:10 路过
“石头”语:素质,注意素质  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-09-07 19:28 黄鹏霄
看来春迷确实存在啊  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-09-09 09:20 123
唉,春迷的存在,是中国软件业的悲哀。  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2006-10-04 12:10 啥叫春迷啊?
难道就只有春迷吗?中国软件业很悲哀吗?兄弟是做那一方面开发的啊?这么伟大,能拯救中国软件业吗?  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2007-01-12 10:16 王彦锋的技术实践
看完无语,大家都是搞技术的,为一些不着调的东东争论,有点不值得。取其精华,去其糟粕,然也。  回复  更多评论
  
# re: “中文问题没商量”之Spring2.0项目中的Bug一例  2007-03-17 12:52 BeanSoft
早点控制农民比例为10%, 实现工业化才是王道....我就看着2050年能不能达到50%农民了.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: