Ninja marco punto final arroja 500 error al intentar asignar a JSON objeto personalizado

Cecil Rodríguez:

Así que tengo un punto final Ninja aquí:

public Result processRecurring(Context context, RecurOrderJSON recurOrderJSON) {
    String id = recurOrderJSON.id;
    String event_type = recurOrderJSON.event_type;
    String request_id = recurOrderJSON.request_id;
    //Map data = recurOrderJSON.data;
    //recurringRouter(event_type, data);
    log.info("ID value");
    log.info(id);

    return JsonResponse.build()
            .message("OK")
            .toResult();
}

La clase que estoy tratando de mapear:

public class RecurOrderJSON {

    public String id;
    public String event_type;
    public String request_id;
    // Maybe switch data type?
    //public Map data;
}

Y la ruta:

router.POST().route("/recurring").with(RecurringController::processRecurring);

Estoy tratando de enviar algunos JSON simple a un web hook y por alguna razón no parece el mapeo objeto que se va a trabajar. Creo que tal vez estoy mal entendido la documentación?

http://www.ninjaframework.org/documentation/working_with_json_jsonp.html

El ejemplo que te dan es la siguiente:

If you send that JSON to your application via the HTTP body you only need to add the POJO class to the controller method and Ninja will parse the incoming JSON for you:

package controllers;

public class ApplicationController {       

    public Result parsePerson(Person person) {

        String nameOfPerson = person.name; // will be John Johnson
        ...

    }
}

Por lo que yo puedo decir, que estoy haciendo esto correctamente? Estoy entendiendo mal la documentación? He aquí un ejemplo de objeto JSON - actualmente sólo estoy tratando de agarrar las cuerdas de alto nivel, pero finalmente va a querer agarrar los datos así:

{
  "id": "hook-XXXXX",
  "event_type": "tx-pending",
  "data": {
    "button_id": "static",
    "publisher_organization": "org-XXXXXXX",
    "campaign_id": "camp-097714a40aaf8965",
    "currency": "USD",
    "order_currency": "USD",
    "id": "tx-XXXXXXX",
    "category": "new-user-order",
    "modified_date": "2018-10-15T05:41:12.577Z",
    "order_total": 9680,
    "button_order_id": "btnorder-77c9e56fd990f127",
    "publisher_customer_id": "XymEz8GO2M",
    "rate_card_id": "ratecard-41480b2a6b1196a7",
    "advertising_id": null,
    "event_date": "2018-10-15T05:41:06Z",
    "status": "pending",
    "pub_ref": null,
    "account_id": "acc-4b17f5a014d0de1a",
    "btn_ref": "srctok-0adf9e958510b3f1",
    "order_id": null,
    "posting_rule_id": null,
    "order_line_items": [
      {
        "identifier": "Antique Trading Card",
        "description": "Includes Lifetime Warranty",
        "amount": 9680,
        "publisher_commission": 968,
        "attributes": {},
        "total": 9680,
        "quantity": 1
      }
    ],
    "order_click_channel": "webview",
    "order_purchase_date": null,
    "validated_date": null,
    "amount": 968,
    "customer_order_id": null,
    "created_date": "2018-10-15T05:41:12.577Z",
    "commerce_organization": "org-XXXXXX"
  },
  "request_id": "attempt-XXXXXXX"
}

Actualmente estoy tratando de obtener los valores de cadena, sin embargo, yo estoy constantemente recibiendo un error 500 y no hay otra indicación en mis registros de cualquier error.

Por lo que yo puedo decir, Ninja sólo debe asignar automáticamente el JSON a mi objeto, correcto?

Bsquare ℬℬ:

I reproducido con éxito el problema, y ​​luego arreglé.

En primer lugar, para la manera fácil de probar / prueba, lo recomiendo modificaciones (temporales):

package controllers;

import models.RecurOrderJSON;
import ninja.Context;
import ninja.Result;

public class RecurringController {
    public Result processRecurring(Context context, RecurOrderJSON recurOrderJSON) {
        log.info("recurOrderJSON => " + recurOrderJSON);
        return ninja.Results.ok();
    }
}

Y luego, actualizar su modelo de esta manera:

package models;

import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class RecurOrderJSON {

    public String id;
    public String event_type;
    public String request_id;
    public Map data;

    @Override
    public String toString() {
        return "RecurOrderJSON [id=" + id + ", event_type=" + event_type + ", request_id=" + request_id + ", data="
                + data.toString() + "]";
    }
}

Se puede notar:

  • El tipo de datos debe permanecer en bruto (genérico no se puede utilizar aquí)
  • los @JsonIgnoreProperties importantes (ignoreUnknown = true) para evitar la anotación de deserializar tema, si es que los datos de origen no coincide perfectamente con su modelo (asegúrese de usar la versión reciente de anotación, en fasterxml sub-paquete, en lugar de la antigua, en Codehaus sub-paquete)
  • toString () que sólo permite la implementación rápida comprobación de OK / KO deserialización

A continuación, puede probar fácilmente el sistema con wget , o rizo :

curl -H 'Content-Type: application/json' -d "@/tmp/jsonINput.json" -X POST http://localhost:8080/recurring

Aviso que es muy importante especificar el tipo de contenido para una buena interpretación.

Con la /tmp/jsonINput.json archivo que contiene exactamente el contenido de JSON que ha especificado en su pregunta.

De esta manera, todo está funcionando a las mil maravillas, la obtención de este resultado:

recurOrderJSON => RecurOrderJSON [id=hook-XXXXX, event_type=tx-pending, request_id=attempt-XXXXXXX, data={button_id=static, publisher_organization=org-XXXXXXX, campaign_id=camp-097714a40aaf8965, currency=USD, order_currency=USD, id=tx-XXXXXXX, category=new-user-order, modified_date=2018-10-15T05:41:12.577Z, order_total=9680, button_order_id=btnorder-77c9e56fd990f127, publisher_customer_id=XymEz8GO2M, rate_card_id=ratecard-41480b2a6b1196a7, advertising_id=null, event_date=2018-10-15T05:41:06Z, status=pending, pub_ref=null, account_id=acc-4b17f5a014d0de1a, btn_ref=srctok-0adf9e958510b3f1, order_id=null, posting_rule_id=null, order_line_items=[{identifier=Antique Trading Card, description=Includes Lifetime Warranty, amount=9680, publisher_commission=968, attributes={}, total=9680, quantity=1}], order_click_channel=webview, order_purchase_date=null, validated_date=null, amount=968, customer_order_id=null, created_date=2018-10-15T05:41:12.577Z, commerce_organization=org-XXXXXX}]

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212911&siteId=1
Recomendado
Clasificación