调用GeometryJSON()时的NoSuchMethodException .read()

时间:2014-12-02 02:24:28

标签: java geotools jts

我正在使用JTS(来自VividSolutions)和GeoTools。我有以下代码:

public Geometry jsonToGeom(String json) throws IOException {
    Geometry obj = new GeometryJSON().read(json);
    return obj;
}

但是,这将返回以下RunTimeException:

java.lang.RuntimeException: java.lang.NoSuchMethodException: org.geotools.geojson.feature.FeatureHandler.<init>(com.vividsolutions.jts.geom.GeometryFactory)
at org.geotools.geojson.DelegatingHandler.createDelegate(DelegatingHandler.java:130)
at org.geotools.geojson.geom.GeometryHandler.primitive(GeometryHandler.java:68)
at org.json.simple.parser.JSONParser.parse(Unknown Source)
at org.json.simple.parser.JSONParser.parse(Unknown Source)
at org.geotools.geojson.GeoJSONUtil.parse(GeoJSONUtil.java:236)
at org.geotools.geojson.geom.GeometryJSON.parse(GeometryJSON.java:655)
at org.geotools.geojson.geom.GeometryJSON.read(GeometryJSON.java:196)
at am.abhi.experiments.geotoolstest.GeoJson.jsonToGeom(GeoJson.java:13)
at am.abhi.experiments.geotoolstest.SomeTest.testSomething(SomeTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:255)
at junit.framework.TestSuite.run(TestSuite.java:250)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.NoSuchMethodException: org.geotools.geojson.feature.FeatureHandler.<init>(com.vividsolutions.jts.geom.GeometryFactory)
at java.lang.Class.getConstructor0(Class.java:2849)
at java.lang.Class.getConstructor(Class.java:1718)
at org.geotools.geojson.DelegatingHandler.createDelegate(DelegatingHandler.java:123)
... 33 more

在单步执行代码时,我在org.geotools.geojson.DelegatingHandler中找到了这个导致错误的方法:

protected IContentHandler createDelegate(Class clazz, Object[] args) {
    try {
        if (args != null && args.length > 0) {
            Class[] types = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                types[i] = args[i].getClass();
            }

            return (IContentHandler) clazz.getConstructor(types).newInstance(args);
        }
        else {
            return (IContentHandler) clazz.newInstance();
        }

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

return (IContentHandler) clazz.getConstructor(types).newInstance(args)行。

当它调用FeatureHandler并尝试将GeometryFactory作为参数传递时失败。我在JTS 1.8和GeoTools 13-SNAPSHOT上。

任何帮助或解决方法都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题 - 但事实证明它与类路径或JTS版本无关。事实证明,人们使用术语&#34; GeoJSON&#34;意味着不止一件事。

我下载了一些GeoJSON files to describe timezones,其中包含json:

{
  "type": "FeatureCollection", 
  "features": [
    {
      "geometry": {
        "type": "MultiPolygon", 
        "coordinates": [
          [
...

如果您使用此问题中的代码来阅读该文件:

Geometry obj = new GeometryJSON().read(json); 

但是你的json文件实际上就像我的FeatureJSON,你会得到报告的(无用的)错误消息。相反,尝试这样的事情:

FeatureJSON fjson = new FeatureJSON();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.geojson");
FeatureCollection features = fjson.readFeatureCollection(is);

答案 1 :(得分:0)

您的JTS版本错误 - 我怀疑这意味着您没有使用maven。您需要1.13版才能使用GeoTools 13-SNAPSHOT。

$  mvn dependency:tree

[INFO] Scanning for projects...
[INFO]
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building GeoJSON Support 13-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gt-geojson ---
[INFO] org.geotools:gt-geojson:jar:13-SNAPSHOT
[INFO] +- org.geotools:gt-main:jar:13-SNAPSHOT:compile
[INFO] |  +- org.geotools:gt-api:jar:13-SNAPSHOT:compile
[INFO] |  +- com.vividsolutions:jts:jar:1.13:compile
[INFO] |  \- org.jdom:jdom:jar:1.1.3:compile
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1:compile
[INFO] +- org.geotools:gt-epsg-hsql:jar:13-SNAPSHOT:test
[INFO] |  +- org.geotools:gt-referencing:jar:13-SNAPSHOT:compile
[INFO] |  |  +- java3d:vecmath:jar:1.3.2:compile
[INFO] |  |  +- commons-pool:commons-pool:jar:1.5.4:compile
[INFO] |  |  +- org.geotools:gt-metadata:jar:13-SNAPSHOT:compile
[INFO] |  |  |  \- org.geotools:gt-opengis:jar:13-SNAPSHOT:compile
[INFO] |  |  |     \- net.java.dev.jsr-275:jsr-275:jar:1.0-beta-2:compile
[INFO] |  |  \- jgridshift:jgridshift:jar:1.0:compile
[INFO] |  \- org.hsqldb:hsqldb:jar:2.2.8:test
[INFO] +- javax.media:jai_core:jar:1.1.3:compile
[INFO] \- junit:junit:jar:4.11:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test

答案 2 :(得分:0)

为我解决这个问题的原因是我有一个使用JTS 1.8的项目,以及运行1.13的Geotools。在Spring-Boot中,显然只有1.8结束于jar中,从而导致冲突和方法未被发现。我将我的依赖项目更改为与geotools相同的版本,并且已修复。