忍者のフレームワークのエンドポイントは、カスタムオブジェクトにJSONをマップしようとすると500エラーがスローされます

セシル・ロドリゲス:

だから私はここに忍者のエンドポイントを持っています:

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();
}

私はにマップしようとしていますクラス:

public class RecurOrderJSON {

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

そして、ルート:

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

私はウェブフックにいくつかの簡単なJSONを送信しようとしていますし、いくつかの理由でオブジェクトのマッピングが動作していないようです。私は多分、私はドキュメントを誤解していないでしょうか?

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

彼らはあなたを与える例がこれです:

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
        ...

    }
}

私の知る限り、私はこれを正しくやっていますか?私は、ドキュメントの間違ったを理解するのですか?:現在、私は唯一のトップレベルの文字列をつかむしようとしていますが、私は最終的にもグラブデータにしたいでしょう - ここでは例としてJSONオブジェクトです

{
  "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"
}

現在、私は単なる文字列の値を取得しようとしています、まだ私は常に500エラーとエラーの私のログ内の他の適応症を取得しています。

私の知る限り、忍者だけで、自動的に正しい、私のオブジェクトにJSONをマッピングする必要がありますか?

ビースクウエアℬℬ:

私は正常に問題を再現し、それを修正しました。

簡単な方法は、/テストをしようとするための第一は、私が(一時的な)変更をお勧めします:

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();
    }
}

そして、あなたのモデルは、この方法を更新します。

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() + "]";
    }
}

あなたは気づくことができます。

  • データ型は、生のままでなければならない(一般的なここで使用することはできません)
  • 重要@JsonIgnoreProperties回避のデシリアライズの問題に(ignoreUnknown =真)、注釈、今までに、元のデータは完全にあなたのモデルと一致しない場合は(で、代わりに古いもので、fasterxmlサブパッケージで、注釈の最新バージョンを使用してくださいCodehausのサブパッケージ)
  • のみOK / KOデシリアライゼーションの簡単なチェックを許可するのtoString()の実装

そして、あなたは簡単にシステムをテストすることができますwgetの、またはカール

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

通知は、指定することが非常に重要であるコンテンツタイプの良い解釈のために。

/tmp/jsonINput.jsonのあなたは、あなたの質問に指定された正確にJSONの内容を含むファイル。

このように、すべてがこの出力を得る、魔法のように働いています。

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}]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212908&siteId=1