Suite

Bug de l'API GeoServer REST - « Le nom de couverture spécifié n'est pas pris en charge »


J'ai rencontré un problème avec GeoServer REST dans les 2.6.2 et 2.5.4 (mais pas, de façon intéressante, dans 2.3.1).

Lors de l'ajout d'un GeoTIFF avec un chemin accessible à GeoServer, le serveur répond par :

Le coverName spécifié resttestde n'est pas pris en charge

Cela se produit lorsque j'utilise cURL :

curl -X POST -d 'vrairestetestdemrestetestdemEPSG : 4326REPROJECT_TO_DECLARED' http://admin:[email protected]:8080/geoserver/rest/workspaces/fake_rfe2/coveragestores/testRESTStoreGeotiff/coverages.xml --header "Content-Type:application/xml" :Le coverName spécifié resttestde n'est pas pris en charge

Et aussi quand j'utilise GeoServer Manager :

08:22:15.077 [principal] DEBUG httpclient.wire.header - >> "POST /geoserver/rest/workspaces/fake_rfe2/coveragestores/testRESTStoreGeotiff/coverages.xml HTTP/1.1[
][
]" 08:22 :15.079 [main] DEBUG oachttpclient.HttpMethodBase - Ajout d'un en-tête de demande d'hôte 08:22:15.079 [main] DEBUG httpclient.wire.header - >> "Authorization: Basic YWRtaW46Z2Vvc2VydmVy[
][
]" 08:22 : 15.079 [principal] DEBUG httpclient.wire.header - >> "Agent utilisateur : Jakarta Commons-HttpClient/3.1[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "Host : localhost:8080[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "Content-Length: 213[
][
]" 08:22 :15.080 [main] DEBUG httpclient.wire.header - >> "Type de contenu : text/xml[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "[ 
][
]" 08:22:15.081 [principal] DEBUG httpclient.wire.content - >> "vrairestetestdemrestetestdemEPSG : 4326REPROJECT_TO_DECLARED" 08:22:15.081 [main] DEBUG oachmEntityEnclosingMethod - Corps de la requête envoyé 08:22:15.198 [main] DEBUG httpclient.wire.header - << "HTTP/1.1 500 Internal Server Error[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - << "HTTP/1.1 500 Internal Server Error[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - < < "Content-Type: text/plain[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - << "Transfer-Encoding: chunked[
][
]" 08:22:15.198 [principal] DEBUG httpclient.wire.header - << "Serveur : Jetty(6.1.8)[
][
]" 08:22:15.199 [principal] DEBUG httpclient.wire.header - << "[
][
]" 08:22:15.199 [principal] DEBUG httpclient.wire.content - << "3" 08:22:15.199 [principal] DEBUG httpclient.wire.content - << " 7" 08:22:15.199 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.199 [main] DEBUG httpclient.wire.content - << "[
]" 08 : 22:15.199 [principal] DEBUG httpclient.wire.content - << ":Le coverName spécifié restetestdemis non pris en charge" 08:22:15.200 [main] DEBUG httpclient. wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "0" 08:22:15.200 [principal] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [principal] DEBUG httpclient.wire.content - << "[
] " 08:22:15.200 [principal] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [principal] DEBUG httpclient.wire.content - << "[
]" 08:22 :15.200 [principal] DEBUG httpclient.wire.header - << "[
][
]"

Lorsque cela se produit, la trace de pile suivante apparaît dans le journal du serveur :

Causé par : java.lang.IllegalArgumentException : le coverName spécifié resttestde n'est pas pris en charge sur org.geotools.coverage.grid.io.AbstractGridCoverage2DReader.getCoordinateReferenceSystem(AbstractGridCoverage2DReader.java:820) sur org.geoserver.catalogage.CoverageCustomizerDimensionerCoverageCoverageCoverage(AbstractGridCoverage2DReader.java:820) :317) à org.geoserver.catalog.SingleGridCoverage2DReader.getCoordinateReferenceSystem(SingleGridCoverage2DReader.java:151) à org.geoserver.catalog.CatalogBuilder.initCoverage(CatalogBuilder.java:790) à org.geoserver.catalog.rest.CoverageResource(CatalogBuilder.java:790) à CoverageResource.java:87) sur org.geoserver.rest.ReflectiveResource.handlePost(ReflectiveResource.java:121)

En regardant AbstractGridCoverage2DReader.getCoordinateReferenceSystem :

/** * Récupère {@link GeneralEnvelope} pour ce {@link AbstractGridCoverage2DReader}. * * @renvoyez {@link GeneralEnvelope} pour ce {@link AbstractGridCoverage2DReader}. */ @Override public CoordinateReferenceSystem getCoordinateReferenceSystem(String coverName) { if (!checkName(coverageName)) { throw new IllegalArgumentException("Le coverName spécifié " + coverName + "n'est pas supporté"); } renvoie crs; }

Il semble quecheckNamerenvoie false, ce qui signifie quecoverName != this.coverageNameou alorscoverName == null. Hmm.

Des idées?

Mettre à jour:

J'ai pu faire fonctionner ça avec :

curl -v -u admin:geoserver -XPUT -H "Type de contenu : text/plain" -d "file:///Users/gregederer/dev6/EWX_SAMPLE_DATA/RFE2/monthly/data.2000.03.tiff" 'http: //localhost:8080/geoserver/rest/workspaces/fake_rfe2/coveragestores/rfe2_africa_1-month-03-2000_mm_data/external.geotiff?configure=first&coverageName=rfe2_africa_1-month-03-2000_mm_data'

Suivi de (pour changer le style de calque) :

curl -u admin:geoserver -XPUT -H 'Type de contenu : text/xml' -d 'raster' http://localhost:8080/geoserver/rest/layers/fake_rfe2:rfe2_africa_1-month-03-2000_mm_data

J'ai également implémenté cela en Java à l'aide d'Apache HttpComponents :

public boolean createCoverage(String workspace, String name, String path, String layerStyle) { boolean success = false; try { URI uri = new URIBuilder() .setScheme(geoServerScheme) .setHost(geoServerHost) .setPort(geoServerPort) .setPath(geoServerPath + "/rest/workspaces/" + workspace + "/coveragestores/" + nom + "/external .geotiff") .setParameter("configure", "first") .setParameter("coverageName", nom) .build(); StringEntity stringEntity = new StringEntity("file:///" + chemin, ContentType.create ("tex/plain", "UTF-8")); HttpPut httpPut = nouveau HttpPut(uri); httpPut.setEntity(stringEntity); System.out.println("Exécution de la requête " + httpPut.getRequestLine()); Réponse CloseableHttpResponse = httpclient.execute(httpPut); réussi = réponse.getStatusLine().getStatusCode() == 201; réussi = réussi && updateLayerStyle(workspace, name, layerStyle); essayez { System.out.println("-----------------------------------------" ); System.out.println(response.getStatusLine()); } enfin { réponse.close(); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } enfin { essayez { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } retour réussi ; } public boolean updateLayerStyle(String workspace, String layerName, String styleName) { boolean success = false; try { URI uri = new URIBuilder() .setScheme(geoServerScheme) .setHost(geoServerHost) .setPort(geoServerPort) .setPath(geoServerPath + "/rest/layers/" + workspace + ":" + layerName) .build(); StringEntity stringEntity = new StringEntity("" + nom du style + "", ContentType.create ("application/xml", "UTF-8")); HttpPut httpPut = new HttpPut(uri); httpPut.setEntity(stringEntity); System.out.println ("Executing request " + httpPut.getRequestLine) ()); réponse CloseableHttpResponse = httpclient.execute(httpPut); réussi = réponse.getStatusLine().getStatusCode() == 200 ; essayez { System.out.println("------------ ----------------------------"); System.out.println(response.getStatusLine()); } enfin { response.close (); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finalement { try { httpclient. close(); } catch (IOException e) { e.printStackTrace(); } } return réussi; }

J'espère que cette solution de contournement aidera quelqu'un.


J'ai également rencontré ce problème lors de la mise à niveau de 2.1 à 2.6.

Nous publions nativeName (nom de fichier) et name (nom de couche) dans l'API de repos.

Le problème est que pour >= 2.4 le CatalogBuilder est appelé via

couverture = builder.buildCoverage(nom);

Ainsi, dans cette méthode, il n'y a aucune possibilité de faire la distinction entre name et nativeName.

Si vous souhaitez résoudre ce problème vous-même et que cela ne vous dérange pas de créer GeoServer vous-même, vous pouvez faire quelque chose comme ceci dans CoverageResource.handleObjectPost (sans modifier les signatures) :

// Code omis… String name =coverage.getName(); Chaîne nativeName = couverture.getNativeName(); Générateur CatalogBuilder = new CatalogBuilder(catalog); CoverageStoreInfo store =coverage.getStore(); builder.setStore(magasin); // Nous traitons ici 2 cas différents if (!isNew) { // Configuration d'une couverture partiellement définie builder.initCoverage(coverage, name); } else { // Configuration d'une toute nouvelle couverture (seul le nom a été spécifié) cover = builder.buildCoverage(nativeName); couverture.setName(nom); } // Code omis…

Nous définissons toujours name et nativeName via Xml, donc cela ne s'applique pas à nous, mais il peut être bon de vérifier les valeurs nulles, quelque chose comme CatalogBuilder.initResourceInfo le fait…