4

しばらくの間、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 に追加しようとしましたが、違いはないようです。

私はここで完全に立ち往生しているように見えるので、アドバイスをありがとう....

4

1 に答える 1

2

Restlet 2.2 (jackson 2.1.0 に基づいて 10 月にリリース) の最後のスナップショットを試してみましたが、うまくいきました。

于 2012-11-09T08:05:16.667 に答える