Использование 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

Что я делаю не так?

2 ответа

Решение

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

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

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

Также, new DatabaseReader.Builder(database) вызывает конструктор класса Builder для создания нового экземпляра. CF не поддерживает ключевое слово "new" с объектами Java. Вместо этого используйте метод psuedoinit() вызвать конструктор:

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

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

Builder это класс, а не метод. Возможно, попробуйте что-то вроде:

var mm = CreateObject("java", "com.maxmind.geoip2.DatabaseReader$Builder").Init(db).build();
Другие вопросы по тегам