JsonMappingException: el token actual no es START_OBJECT (necesario para desenvolver el nombre de raíz 'Transacción []'), pero START_ARRAY

Estoy usando la primaveraPlantilla de descanso consumir elAPI de Chargify, utilizando JSON como el formato de carga útil. Ha funcionado bastante bien, sin embargo, cuando intento OBTENER una matriz de objetos, falla estrepitosamente. Por ejemplo, considere lo siguiente:

Transaction[] transactions = restTemplate.getForObject(
        CHARGIFY_ENDPOINT + "/subscriptions/{subscription}/transactions.json",
        Transaction[].class,
        subscriptionId
    );

El GET real va bien, con una respuesta JSON de:

[ { "transaction" : { "amount_in_cents" : 3006,
    "created_at" : "2012-06-17T16:32:05-04:00",
    "ending_balance_in_cents" : 0,
    "id" : 17283728,
    "kind" : null,
    "memo" : "",
    "payment_id" : null,
    "product_id" : 120387,
    "subscription_id" : 1947292,
    "success" : true,
    "transaction_type" : "payment",
    "type" : "Payment"
      } },
  { "transaction" : { "amount_in_cents" : 5900,
    "created_at" : "2012-06-17T16:32:05-04:00",
    "ending_balance_in_cents" : 3006,
    "id" : 17283727,
    "kind" : "baseline",
    "memo" : "Professional Plan (06/17/2012 - 07/17/2012)",
    "payment_id" : 17283728,
    "product_id" : 120387,
    "subscription_id" : 1947292,
    "success" : true,
    "transaction_type" : "charge",
    "type" : "Charge"
      } },
  { "transaction" : { "amount_in_cents" : -2894,
    "created_at" : "2012-06-17T16:32:03-04:00",
    "ending_balance_in_cents" : -2894,
    "id" : 17283726,
    "kind" : "prorated",
    "memo" : "",
    "payment_id" : null,
    "product_id" : 120387,
    "subscription_id" : 1947292,
    "success" : null,
    "transaction_type" : "adjustment",
    "type" : "Adjustment"
      } },
  { "transaction" : { "amount_in_cents" : 2900,
    "created_at" : "2012-06-17T15:17:07-04:00",
    "ending_balance_in_cents" : 0,
    "id" : 17281084,
    "kind" : null,
    "memo" : "",
    "payment_id" : null,
    "product_id" : 120386,
    "subscription_id" : 1947292,
    "success" : true,
    "transaction_type" : "payment",
    "type" : "Payment"
      } },
  { "transaction" : { "amount_in_cents" : 2900,
    "created_at" : "2012-06-17T15:17:06-04:00",
    "ending_balance_in_cents" : 2900,
    "id" : 17281083,
    "kind" : "baseline",
    "memo" : "Standard Plan (06/17/2012 - 07/17/2012)",
    "payment_id" : 17281084,
    "product_id" : 120386,
    "subscription_id" : 1947292,
    "success" : true,
    "transaction_type" : "charge",
    "type" : "Charge"
      } }
]

Sin embargo, cuando Jackson intenta deserializar el JSON, resulta enJsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY:

16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - GET request for "https://foobar.chargify.com/subscriptions/1947292/transactions.json" resulted in 200 (OK)
16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - Reading [[Lcom.foobar.chargify.Transaction;] as "application/json;charset=utf-8" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@1ea8dbd]
16:59:12.662 [http-8080-1] DEBUG org.apache.http.wire - << "[{"transaction":{"type":"Payment","amount_in_cents":3006,"payment_id":null,"memo":"","id":17283728,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120387,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":5900,"payment_id":17283728,"memo":"Professional Plan (06/17/2012 - 07/17/2012)","id":17283727,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":3006,"success":true,"product_id":120387,"transaction_type":"charge"}},{"transaction":{"type":"Adjustment","amount_in_cents":-2894,"payment_id":null,"memo":"","id":17283726,"created_at":"2012-06-17T16:32:03-04:00","subscription_id":1947292,"kind":"prorated","ending_balance_in_cents":-2894,"success":null,"product_id":120387,"transaction_type":"adjustment"}},{"transaction":{"type":"Payment","amount_in_cents":2900,"payment_id":null,"memo":"","id":17281084,"created_at":"2012-06-17T15:17:07-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120386,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":2900,"payment_id":17281084,"memo":"Standard Plan (06/17/2012 - 07/17/2012)","id":17281083,"created_at":"2012-06-17T15:17:06-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":2900,"success":true,"product_id":120386,"transaction_type":"charge"}}]"
16:59:12.683 [http-8080-1] DEBUG org.apache.http.impl.conn.SingleClientConnManager - Releasing connection org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@17ed710
16:59:12.684 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
 at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]

Me encontré con este problema antes con Jackson, y después de un par de días de investigación terminé por una ruta diferente. Esa no es una opción esta vez, y no estoy teniendo la suerte de encontrar una solución.

¿Algunas ideas? No me importa si consigo una matriz o unaList atrás. No he tenido suerte con ninguno de los dos.

Mientras leía los documentos de Jackson, vi dónde debería poder completar la lista, es decir,new TypeReference<List<Transaction>>(), pero tampoco tuve suerte allí.

Por cierto, debido a cómo Chargify formatea sus respuestas JSON, mi RestTemplate está configurada con un personalizadoObjectMapper que establece estas opciones:

configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);

Cuando elimino estas opciones, noJsonMappingException Se lanza sin embargo todos los campos de los resultantesTransaction los objetos son nulos

También intenté agregar esta opción, pero no parece ayudar:

configure(DeserializationConfig.Feature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);

Respuestas a la pregunta(1)

Su respuesta a la pregunta