【问题标题】:Using MaxMind java class with ColdFusion将 MaxMind java 类与 ColdFusion 一起使用
【发布时间】:2016-06-19 18:03:28
【问题描述】:

我正在尝试将 MaxMind java 库与 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

我做错了什么?

【问题讨论】:

  • 旁注,'file' 是 CF 中的保留字,因此您可能需要选择不同的变量名以避免意外问题。
  • 是的,我已经即时发布了代码,仅作为示例。我的真实代码有点不同。谢谢

标签: java coldfusion railo maxmind lucee


【解决方案1】:

Builder 是一个类,而不是一个方法。也许尝试类似:

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

【讨论】:

  • Drat.. 领先我五秒! +1 ;-)
  • ... 可以发誓“$”第一次不存在 ;-)
【解决方案2】:

更新:@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();

注意: 仅当使用一个或多个参数调用 class constructor 时才需要显式调用 init(),就像这里的情况一样。如果Java 代码使用默认的无参数构造函数,即new DatabaseReader.Builder().build(),则技术上可以省略对init() 的调用。如果需要,当调用第一个非静态方法(即build())时,CF 会自动调用无参数构造函数。

【讨论】:

  • 很好的解释。绝对比我的更完整。 :-)
  • @oschwald - 谢谢。虽然我从你的个人资料中看到,你绝对是更有知识的资源,可以用来解答有关 MaxMind 内部运作的问题 :)
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2013-01-07
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多