调用GeometryJSON()。read()时发生NoSuchMethodException

Abh*_*Das 5 java jts geotools

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

public Geometry jsonToGeom(String json) throws IOException {
    Geometry obj = new GeometryJSON().read(json);
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

但是,这将返回以下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
Run Code Online (Sandbox Code Playgroud)

在逐步执行代码时,我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上线return (IContentHandler) clazz.getConstructor(types).newInstance(args)

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

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

Ian*_*ton 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
Run Code Online (Sandbox Code Playgroud)