stil4m / mollie-api

Mollie API for Java
14 stars 14 forks source link

JsonMappingException creating iDEAL payment #13

Closed jcassee closed 8 years ago

jcassee commented 8 years ago

When I try to create a test iDEAL payment using this code, deserializing the response throws a JsonMappingException:

Client client = new ClientBuilder()
        .withApiKey(MOLLIE_API_KEY)
        .build();
CreatePayment createPayment = new CreateIdealPayment(36.0, "Test", "http://example.com",
        EMPTY_MAP, new IdealPaymentOptions("ideal_TESTNL99"));
ResponseOrError<CreatedPayment> responseOrError = client.payments().create(createPayment);

This is the exception:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
 at [Source: org.apache.http.conn.EofSensorInputStream@57dcc6a3; line: 1, column: 183]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:749) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:745) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:307) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1056) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051) ~[jackson-databind-2.4.2.jar:2.4.2]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2199) ~[jackson-databind-2.4.2.jar:2.4.2]
    at nl.stil4m.mollie.RequestExecutor.deserialize(RequestExecutor.java:43) ~[mollie-api-2.0.0.jar:na]
    at nl.stil4m.mollie.RequestExecutor.lambda$execute$2(RequestExecutor.java:34) ~[mollie-api-2.0.0.jar:na]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:218) ~[httpclient-4.3.1.jar:4.3.1]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160) ~[httpclient-4.3.1.jar:4.3.1]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:136) ~[httpclient-4.3.1.jar:4.3.1]
    at nl.stil4m.mollie.RequestExecutor.execute(RequestExecutor.java:30) ~[mollie-api-2.0.0.jar:na]
    at nl.stil4m.mollie.concepts.Payments.create(Payments.java:39) ~[mollie-api-2.0.0.jar:na]

Example response body:

{
  "id":"XXX",
  "mode":"test",
  "createdDatetime":"2016-07-05T14:10:33.0Z",
  "status":"open",
  "expiryPeriod":"PT15M",
  "amount":"36.00",
  "description":"Test",
  "method":"ideal",
  "metadata":[],
  "details":null,
  "profileId":"XXX",
  "links": {
    "paymentUrl":"https://www.mollie.com/paymentscreen/ideal/testmode?transaction_id=XXX&bank_trxid=XXX",
    "redirectUrl":"http://example.com"
  }
}

So it appears CreatedPayment does not expect metadata to be an array.

jcassee commented 8 years ago

When I add some metadata to the request, the metadata property in the response is an object and deserialization succeeds.

stil4m commented 8 years ago

This seems to be an error in the Mollie API. I will file a bug report.

stil4m commented 8 years ago

For now it seems to be the best choice to check if the map is empty and pass a null. The API only fails on empty maps.

jcassee commented 8 years ago

Thanks, Mats!

stil4m commented 8 years ago

No problem. Note that I only patched the test sources, thus a version bump is not required. The people from Mollie fixed this on their side.