2016-03-06 62 views
4

我試圖在ColdFusion中使用MaxMind java庫。在ColdFusion中使用MaxMind java類

我開始在官方網站的MaxMind轉換此示例代碼:

// A File object pointing to your GeoIP2 or GeoLite2 database 
File database = new File("/path/to/GeoIP2-City.mmdb"); 

// This creates the DatabaseReader object, which should be reused across 
// lookups. 
DatabaseReader reader = new DatabaseReader.Builder(database).build(); 

InetAddress ipAddress = InetAddress.getByName("128.101.101.101"); 

// Replace "city" with the appropriate method for your database, e.g., 
// "country". 
CityResponse response = reader.city(ipAddress); 

Country country = response.getCountry(); 

我已經試過是:

var file = "pathto\maxmind\GeoLite2-City.mmdb"; 
var db = createObject("java","java.io.File").init(file); 

var mm = createObject("java", "com.maxmind.geoip2.DatabaseReader") 
.Builder(db) 
.build(); 

dump(c);abort; 

我得到這個錯誤:

Type: java.lang.NoSuchMethodException 
Messages: No matching Method for Builder(java.io.File) found 
for com.maxmind.geoip2.DatabaseReader 

我做錯了嗎?

+0

注意,'file'是CF中的保留字,因此您可能需要選擇不同的變量名稱以避免無意中發生的問題。 – Leigh

+0

是的,我已經發布了代碼,僅作爲示例。我的真實代碼有點不同。謝謝 – Tropicalista

回答

3

更新:@oschwald already provided the answer不過,我把這個作爲一個擴展的評論,因爲它包含了從CF訪問內部類和構造一些有用的信息。)

DatabaseReader reader = new DatabaseReader.Builder(database).build();

注意新類名稱語句中的.?這表明Builder是一種特殊的類。它是DatabaseReader的嵌套或inner class,所以您需要使用特殊語法來創建它的一個實例,即createObject("java", "path.OuterClass$InnerClass")

此外,new DatabaseReader.Builder(database)調用Builder類的構造函數來創建一個新的實例。 CF不支持java對象的「new」關鍵字。相反,使用psuedo method init()調用構造函數:

var mm = createObject("java", "com.maxmind.geoip2.DatabaseReader$Builder").init(db).build(); 

NB:調用init()明確與一個或多個參數調用class constructor時才需要,比如這裏的情況。如果java代碼使用默認的無參數構造函數,即new DatabaseReader.Builder().build(),則可以在技術上省略對init()的調用。當第一個非靜態方法 - 即build() - 被調用時,CF會根據需要自動調用無參數構造函數。

+0

很好的解釋。絕對比我的更完整。 :-) –

+0

@oschwald - 謝謝。雖然我從你的個人資料中看到,你肯定是更有知識的資源來挖掘有關MaxMind內部工作的問題:) – Leigh

2

Builder是一個類,而不是一個方法。也許你可以試試:

var mm = CreateObject("java", "com.maxmind.geoip2.DatabaseReader$Builder").Init(db).build(); 
+0

Drat ..打我五秒! +1 ;-) – Leigh

+0

......本來可以發誓的「$」並不是第一次出現;-) – Leigh