opentripplanner / OpenTripPlanner

An open source multi-modal trip planner
http://www.opentripplanner.org
Other
2.13k stars 1.01k forks source link

GBFS feeds parse failure when gbfs.json is referencing itself #5889

Closed leonardehrenfried closed 1 month ago

leonardehrenfried commented 1 month ago

Expected behavior

When a GBFS feed is parsed that contains a gbfs.json referencing itself the following exception is thrown:

(GbfsFeedLoader.java:142) Error parsing vehicle rental feed from https://gbfs.bcycle.com/bcycle_indego/gbfs.json. Details: org.opentripplanner.framework.io.OtpHttpClientException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "en" (class org.mobilitydata.gbfs.v2_3.gbfs.GBFSData), not marked as ignorable (0 known properties: ])
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 25] (through reference chain: org.mobilitydata.gbfs.v2_3.gbfs.GBFSGbfs["data"]->org.mobilitydata.gbfs.v2_3.gbfs.GBFSData["en"]).
org.opentripplanner.framework.io.OtpHttpClientException: org.opentripplanner.framework.io.OtpHttpClientException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "en" (class org.mobilitydata.gbfs.v2_3.gbfs.GBFSData), not marked as ignorable (0 known properties: ])
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 25] (through reference chain: org.mobilitydata.gbfs.v2_3.gbfs.GBFSGbfs["data"]->org.mobilitydata.gbfs.v2_3.gbfs.GBFSData["en"])
    at org.opentripplanner.framework.io.OtpHttpClient.mapResponse(OtpHttpClient.java:344)
    at org.opentripplanner.framework.io.OtpHttpClient.lambda$executeAndMap$3(OtpHttpClient.java:243)
    at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:247)
    at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:188)
    at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:162)
    at org.opentripplanner.framework.io.OtpHttpClient.executeAndMapWithResponseHandler(OtpHttpClient.java:322)
    at org.opentripplanner.framework.io.OtpHttpClient.executeAndMap(OtpHttpClient.java:239)
    at org.opentripplanner.framework.io.OtpHttpClient.sendAndMap(OtpHttpClient.java:363)
    at org.opentripplanner.framework.io.OtpHttpClient.getAndMap(OtpHttpClient.java:191)
    at org.opentripplanner.framework.io.OtpHttpClient.getAndMapAsJsonObject(OtpHttpClient.java:124)
    at org.opentripplanner.framework.io.OtpHttpClient.getAndMapAsJsonObject(OtpHttpClient.java:111)
    at org.opentripplanner.updater.vehicle_rental.datasources.GbfsFeedLoader.fetchFeed(GbfsFeedLoader.java:140)
    at org.opentripplanner.updater.vehicle_rental.datasources.GbfsFeedLoader$GBFSFeedUpdater.fetchData(GbfsFeedLoader.java:170)
    at org.opentripplanner.updater.vehicle_rental.datasources.GbfsFeedLoader.update(GbfsFeedLoader.java:114)
    at org.opentripplanner.updater.vehicle_rental.datasources.GbfsVehicleRentalDataSource.update(GbfsVehicleRentalDataSource.java:61)
    at org.opentripplanner.updater.vehicle_rental.VehicleRentalUpdater.runPolling(VehicleRentalUpdater.java:130)
    at org.opentripplanner.updater.spi.PollingGraphUpdater.run(PollingGraphUpdater.java:52)
    at org.opentripplanner.updater.GraphUpdaterManager.lambda$startUpdaters$0(GraphUpdaterManager.java:105)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.opentripplanner.framework.io.OtpHttpClientException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "en" (class org.mobilitydata.gbfs.v2_3.gbfs.GBFSData), not marked as ignorable (0 known properties: ])
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 25] (through reference chain: org.mobilitydata.gbfs.v2_3.gbfs.GBFSGbfs["data"]->org.mobilitydata.gbfs.v2_3.gbfs.GBFSData["en"])
    at org.opentripplanner.framework.io.OtpHttpClient.lambda$getAndMapAsJsonObject$1(OtpHttpClient.java:132)
    at org.opentripplanner.framework.io.OtpHttpClient.mapResponse(OtpHttpClient.java:342)
    ... 23 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "en" (class org.mobilitydata.gbfs.v2_3.gbfs.GBFSData), not marked as ignorable (0 known properties: ])
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 25] (through reference chain: org.mobilitydata.gbfs.v2_3.gbfs.GBFSGbfs["data"]->org.mobilitydata.gbfs.v2_3.gbfs.GBFSData["en"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1153)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2241)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1793)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1771)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:310)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
    at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4905)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3885)
    at org.opentripplanner.framework.io.OtpHttpClient.lambda$getAndMapAsJsonObject$1(OtpHttpClient.java:130)
    ... 24 common frames omitted

Observed behavior

Should parse successfully.

This has started happening after the change from the entur to the mobilitydata GBFS package.

Version of OTP used (exact commit hash or JAR name)

f5355246ba8c1ce21a2aa310484846f7332a9dd4

Data sets in use (links to GTFS and OSM PBF files)

https://gbfs.bcycle.com/bcycle_indego/gbfs.json

cc @testower

leonardehrenfried commented 1 month ago

Here is a branch that shows this behaviour by making a test fail: https://github.com/ibi-group/OpenTripPlanner/commit/ff938e31573837df9bf770ecfd0ebe3857b6cffb

testower commented 1 month ago

Fix is here: https://github.com/MobilityData/gbfs-json-schema/pull/129