2011-09-11 37 views
6

我正在使用一個具有類似const的枚舉類型的lib;OrientDB遇到Unicode,土耳其語和枚舉的問題

Type.SHORT 
Type.LONG 
Type.FLOAT 
Type.STRING 

雖然我在Eclipse我調試,我得到了一個錯誤:

No enum const class Type.STRİNG 

由於我使用的是土耳其的系統,對工作我一個問題>我的,但因爲這是一個枚舉常量,儘管我將每個屬性都設置爲UTF-8,但沒有什麼可以得到的,它應該是Eclipse應該尋找的。但它仍然尋找STRİNG,它無法找到,我不能使用它。我必須爲此做些什麼?

項目>屬性>資源>文本文件編碼現在是UTF-8。問題不斷。

編輯:更多的信息可能會給我一些線索,我不能得到; 我正在OrientDB上工作。這是我第一次嘗試,所以我不知道這個問題是否可以在OrientDB軟件包上。但我正在使用許多其他庫,我從來沒有見過這樣的問題。在這個包中有一個OType枚舉,我只是試圖連接到數據庫。

String url = "local:database"; 
    ODatabaseObjectTx db = new ODatabaseObjectTx(url). 
    Person person = new Person("John"); 
    db.save(person); 
    db.close(); 

沒有更多的代碼可供使用。數據庫創建的,但後來我得到java.lang.IllegalArgumentException

Caused by: java.lang.IllegalArgumentException: No enum const class com.orientechnologies.orient.core.metadata.schema.OType.STRİNG 
    at java.lang.Enum.valueOf(Unknown Source) 
    at com.orientechnologies.orient.core.metadata.schema.OType.valueOf(OType.java:41) 
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:81) 
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:35) 
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:43) 
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:28) 
    at com.orientechnologies.orient.core.storage.OStorageEmbedded.command(OStorageEmbedded.java:63) 
    at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.execute(OCommandRequestTextAbstract.java:63) 
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.addProperty(OClassImpl.java:342) 
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.createProperty(OClassImpl.java:258) 
    at com.orientechnologies.orient.core.metadata.security.OSecurityShared.create(OSecurityShared.java:177) 
    at com.orientechnologies.orient.core.metadata.security.OSecurityProxy.create(OSecurityProxy.java:37) 
    at com.orientechnologies.orient.core.metadata.OMetadata.create(OMetadata.java:70) 
    at com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.create(ODatabaseRecordAbstract.java:142) 
    ... 4 more 

這裏是OType類:http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OType.java

等班; OCommandExecutorSQLCreateProperty: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateProperty.java

線81說:type = OType.valueOf(word.toString());

+0

當您在鍵入'Type.STR'後立即按下'CTRL + Space'時,Eclipse會自動完成correclty嗎? –

+0

其實我沒有直接使用它。必須有像反射或使用它的東西。但作爲你的問題的答案,通過打字,沒有問題。 Ctrl + Space給了我Type.STRING(正確,沒有問題) –

+0

也許反射地調用enum的代碼有問題 - 這個值是從哪裏來的?用戶輸入形式只有土耳其語的鍵盤,或另一個發送'İ'而不是'I'的系統? –

回答

6

我是否正確地假設你正在使用土耳其語區域設置運行此程序?然後,它似乎錯誤是符合OCommandExecutorSQLCreateProperty 118:

linkedType = OType.valueOf(linked.toUpperCase()); 

你必須指定其上蓋規則應使用的語言環境,可能Locale.ENGLISH作爲參數傳遞給toUpperCase

+0

非常感謝。我認爲現在最合理的答案是你的。但是,我會如何做到這一點?我只使用這個庫,爲什麼這隻發生在這個庫? –

+0

我發現了這個問題,不是在你指出的那條線上,而是非常相似。在OCommandExecuterSQLAbstract第40行中有一個「toUpperCase()」方法。它給了我STRİNG土耳其語區域設置應該給。我更改我的區域設置爲Locale.setLocale(Locale.ENGLISH),它工作正常。但有個問題;如果我需要使用土耳其語的數據,並且如果我沒有土耳其語的語言環境,這將是另一個問題。我建議OrientDB通過將其代碼更改爲toUpperCase(Locale.ENGLISH)來解決此問題;我們將看到會發生什麼:)非常感謝 –

+0

我已經使用了這個解決方案,並承諾OrientDB SVN r3818。 我已經離開.toUpperCase()SQL運算符,因爲它是正確的,它使用區域設置來處理土耳其文。 Lvc @ – Lvca

0

一個變通的方法是鍵入Type.ST,然後按Ctrl-空間。 Eclipse應該自動完成變量名稱,而不必弄清楚如何在土耳其語鍵盤上輸入一個無點大寫的I。 :)

+0

這沒有問題。只是有些人稱之爲,而Eclipse錯誤地獲取。 –

1

此問題與您的數據庫連接有關。據推測,OrientDB中有一個字符串,你正在閱讀它,然後試圖用它來選擇枚舉的一個成員。

我在代碼中假設您發佈變量word來自數據庫中的數據。如果它來自其他地方,那麼問題在於「其他地方」。如果OrientDB出於某種奇怪的原因返回'STRİNG'作爲元數據來告訴你某種東西的類型,那麼這在OrientDB中確實是一個缺陷。

如果該字符串實際上包含一個©,那麼沒有Eclipse設置將對結果有任何影響。你將不得不正常化 I至I.

編寫代碼,如果你傾倒了「字」的內容作爲char S中的字符串的十六進制值的順序,我想你會看到你的I凝視着你。你必須改變數據庫中的東西,以便擁有一個普通的老我。

+0

謝謝。那麼,實際上即使沒有數據庫上的數據,也會發生這種情況。創建數據庫時拋出這個異常,我甚至沒有放任何東西。那麼我應該更多地考慮OrientDB類的問題? –

+1

它似乎暗示問題出在OrientDB元數據中。 'String'是支持的數據類型之一嗎?你使用OrientDB的土耳其版本還是它的驅動程序?很難想象這種基本的QA滑落,但除非你管理元數據(可能是一個映射文件?),這是我看起來的地方。 – TMN

+0

我沒有使用任何土耳其語版本。只有我的操作系統(Windows7)是土耳其語(也許JVM默認語言環境爲土耳其語),但我不使用土耳其語版本的任何Eclipse插件或任何包/庫,OrientDB及其驅動程序。我認爲沒有關於String數據類型作爲支持的問題。而且,我不管理元數據/映射,我只是在開始:) –

1

不幸的是,它與你的操作系統的區域設置有關,這是土耳其語。

兩個變通方案:

1. Change your regional settings to English-US 

2. Give encoding to she jvm as command line param for setting locale to English 

    -Duser.language=en -Duser.region=EN 

我已經創建了XMLBeans的錯誤報告,存在和Apache CXF對於同樣的問題。枚舉toUpper是例外的一點。

一些相關鏈接:

https://issues.apache.org/jira/browse/XMLSCHEMA-22

http://mail-archives.apache.org/mod_mbox/xmlbeans-user/201001.mbox/%[email protected]%3E

http://mail-archives.apache.org/mod_mbox/cxf-users/201203.mbox/%[email protected]%3E

https://vaadin.com/forum/-/message_boards/view_message/793105

http://comments.gmane.org/gmane.comp.apache.cxf.user/18316