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