1

我想从 Grails 应用程序中的 IP 地址检索地理位置。

我尝试了 hostipgeoip都引发异常并且对我不起作用。有没有其他方法可以获取地理位置?

当我使用geoip时,我有:

配置.groovy:

geoip.data.resource= "/WEB-INF/GeoLiteCity.dat"
geoip.data.cache="GEOIP_STANDARD"

在我的控制器中:

GeoIpService geoIpService

index() {
    def location = geoIpService.getLocation("85.176.52.75")
    render location.countryName + " " + location.city       
}

例外是:

| Error 2013-07-26 14:04:22,236 [http-bio-8090-exec-1] ERROR   
errors.GrailsExceptionResolver  - NullPointerException occurred when processing request:   [GET] /test/home/index
Stacktrace follows:
Message: null
Line | Method
->>  199 | <init>                    in java.util.StringTokenizer
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    221 | <init>                    in     ''
|    624 | getLocationwithdnsservice in com.maxmind.geoip.LookupService
|    593 | getLocation               in     ''
|     42 | getLocation . . . . . . . in org.grails.geoip.service.GeoIpService
|     12 | index                     in test.HomeController
|    195 | doFilter . . . . . . . .  in    
grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter                  in grails.plugin.cache.web.filter.AbstractFilter
|   1145 | runWorker . . . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    615 | run                       in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . . . . . . in java.lang.Thread
4

1 回答 1

2

从 github 下载示例 grails 应用程序后,调试了一段时间后,我发现了问题所在。嗯,确实有两个问题:

  • 您对 geoip 插件的配置不正确
  • geoip 插件的文档使您的配置看起来是正确的,但实际上并非如此。

如果您查看插件的文档:http: //grails.org/plugin/geoip,您会看到它讨论了以下配置geoip.data.cache

geoip.data.cache - 这有 4 个可能的值:
0 - GEOIP_STANDARD
1 - GEOIP_MEMORY_CACHE
2 - GEOIP_CHECK_CACHE
4 - GEOIP_INDEX_CACHE

所以它实际上在寻找的是数值,而不是它们旁边的字符串。例如,0 用于 GEOIP_STANDARD,因此您可以使用以下命令对其进行配置:

geoip.data.cache=0

当我将您的示例应用程序的配置更改为上述配置时,我不再遇到异常。

于 2013-08-01T11:40:02.643 回答