しばらくの間、Restlet GA の 3 月 2.2 スナップショットを使用し、Jackson を使用して JSON 変換を処理しています。すべてが正常に機能しており、本質的に目に見えません。特に、objectMapper をインスタンス化する必要さえありません。Joda DateTime も使用していますが、これも問題ありません。
今週、Jackson 2.0.4 (1.9 ではなく) を使用する最新の 2.2 スナップショットにアップグレードしました。そのバージョンの Jackson では、Joda DateTime のサポートがモジュールに移動されました (コアの Jackson ライブラリから)。
ここで、テスト コードを実行すると、次のようなエラーが表示されます。
WARNING: Unable to convert a [application/json,UTF-8] representation into an object of class com.fourspires.api.dto.CommitmentDTO
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "year" (class org.joda.time.DateTime), not marked as ignorable (2 known properties: , "chronology", "millis"])
at [Source: org.restlet.engine.io.UnclosableInputStream@dcc5312; line: 1, column: 701] (through reference chain: com.fourspires.api.dto.CommitmentDTO["completeBy"]->org.joda.time.DateTime["year"])
Post() を実行しようとすると、415 エラーが発生します。
Jackson 関係者からの回答は、変換を処理する JodaModule を次のように登録する必要があるというものです。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
これは簡単に思えますが、このコードをどこに置くべきかわかりません。私のテストコードは呼び出しています:
commitmentsResource =
rootClient.getChild(SOME_PATH, CommitmentsResource.class);
commitmentsClient = ((ClientProxy) commitmentsResource).getClientResource();
commitmentsClient.post()
サーバー側には、次のインターフェースがあります。
public interface CommitmentsResource {
@Get Representation represent();
@Post("json") Representation postJson(CommitmentDTO commitment);
@Post("form") Representation postForm(Form commitmentForm);
}
そして、私は持っているCommitmentServerResourceを持っています
@Override
public final Representation postJson(final CommitmentDTO commitmentDTO) {...}
@Override
public final Representation postForm(final Form form) {...}
そのため、Post() を呼び出せるように objectMapper を挿入する場所がわかりません。グローバル/デフォルト オブジェクト マッパーを設定したいのですが、どこにあるのか (または存在するのか) がわかりません。
objectMapper の 2 行のコードを createInboundRoot に追加しようとしましたが、違いはないようです。
私はここで完全に立ち往生しているように見えるので、アドバイスをありがとう....