2016-03-06 8 views
4

Я пытаюсь использовать java-библиотеку MaxMind с ColdFusion.Использование класса Java MaxMind с ColdFusion

я начать конвертирование этот пример кода на официальном сайте 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

Сторона примечания, «файл» является зарезервированным словом в CF, поэтому вы можете выбрать другое имя переменной, чтобы избежать непреднамеренных проблем. – Leigh

+0

Да, я опубликовал код «на лету» только в качестве примера. Мой настоящий код немного отличается. Спасибо – Tropicalista

ответ

3

(Update:@oschwald already provided the answer Однако, я оставляю это как расширенный комментарий, поскольку он содержит некоторые полезные сведения о доступе внутренних классов и конструкторов из CF.)

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

Обратите внимание на . в описании нового класса? Это означает, что Builder - это особый тип класса. Это вложенный или inner class DatabaseReader, поэтому вам нужно использовать специальный синтаксис для создания экземпляра, то есть createObject("java", "path.OuterClass$InnerClass").

Кроме того, new DatabaseReader.Builder(database) вызывает конструктор класса Builder для создания нового экземпляра. CF не поддерживает «новое» ключевое слово с java-объектами. Вместо этого используйте psuedo method init() вызвать конструктор:

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

NB: Вызов init() явно требуется только при вызове class constructor с одним или несколькими аргументами, как это имеет место в данном случае. Если вместо java-кода использовался конструктор no-argument по умолчанию, то есть new DatabaseReader.Builder().build(), вы могли бы технически опустить вызов init(). CF автоматически вызывает конструктор без аргументов, если это необходимо, когда вызывается первый нестатический метод - то есть build() -.

+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