love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評論

          Spring2.0項(xiàng)目中的中文問題

          Spring是一個非常優(yōu)秀的開源項(xiàng)目,然而,跟其它任何優(yōu)秀的系統(tǒng)產(chǎn)品一樣,也存在著這樣那樣的問題,我們喜歡稱為Bug。Spring中的Bug確實(shí)不少,今天為了充實(shí)“中文問題沒商量”主題,舉一個不算很重要,也比較簡單理解的一個Bug示例。
            這里提前申明,這個話題不是針對Spring項(xiàng)目,因此請“春迷”們自重、沒事勿擾,文中不足之處歡迎大家批評指教。
            我們知道,一個開源軟件項(xiàng)目,給用戶的單元測試最基本的要求是能全部通過測試,在Java中就是在運(yùn)行單元測試的時候應(yīng)該要看見一個綠條。Spring項(xiàng)目的單元測試寫得非常好,也非常全面。然而,單元測試中卻有一些問題,在中文路徑上無法完全通過測試,必須放到英文路徑下才能完全通過測試,因此,這屬于一種“沒商量”的中文問題。
            單元測試:
            包:org.springframework.beans.factory.xml
            類:XmlBeanFactoryTests
            方法:testFileSystemResourceWithImport
            錯誤圖示:
          ?


            詳細(xì)錯誤信息:
          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 (系統(tǒng)找不到指定的路徑。)
          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 (系統(tǒng)找不到指定的路徑。)
          ?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");
          ?}
          ?
          出錯原因:
            這個問題是筆者在參與開發(fā)EasyJWeb及EasyDBO框架中遇到過的問題,因此很容易就找到了問題的所在。Java的Class.getResource(name)返回的是一個URL,而URL.getFile默認(rèn)情況下返回的是經(jīng)過URL編碼后的字符,會把中文等特殊字符變成類似%e6的形式。而一般io構(gòu)造路徑是沒有自動解碼功能的,所以在中文路徑下要出現(xiàn)錯誤。
          ?
          解決辦法:
            在使用URL.getFile返回的路徑時,使用前需要使用java.net.URLDecoder對路徑進(jìn)行一次解碼操作。修改后的且能通過測試的方法如下:
          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");
          ?}
          ?
          小結(jié):
            由于Spring開源項(xiàng)目的開發(fā)團(tuán)隊(duì)中,除了一些喜歡跟在Rod大叔的屁股后面唱中文版贊歌的“春迷”以外,當(dāng)前似乎還沒有中國人參與到正式的Spring開發(fā)小組中。因此,也許沒有在中文路徑下運(yùn)行過測試用例,導(dǎo)致我這樣的Spring初學(xué)者一不小心就遇上這樣的問題。
            問題是解決了,但是卻是一種比較罕見的方式,而且Spring開發(fā)小組事先也許沒有預(yù)想到或是故意忽略掉的問題,因此,可以稱得上是“沒商量”的中文問題。

          posted on 2007-01-11 15:10 liaojiyong 閱讀(435) 評論(0)  編輯  收藏 所屬分類: Spring

          主站蜘蛛池模板: 南昌县| 保定市| 永州市| 疏勒县| 商城县| 囊谦县| 公安县| 大兴区| 静乐县| 平陆县| 星子县| 祁东县| 高密市| 鄂尔多斯市| 崇州市| 曲阜市| 从化市| 东至县| 崇文区| 万山特区| 方城县| 左权县| 四川省| 壶关县| 黔西县| 上虞市| 阿坝县| 罗城| 赣州市| 荃湾区| 松原市| 奉节县| 临澧县| 邛崃市| 墨竹工卡县| 肥乡县| 肥东县| 合肥市| 凌海市| 扎赉特旗| 文水县|