0

JAX-RS で Web サービスを作成しています。JAXB アノテーションを使用してドメイン モデルにアノテーションを付け、振り返ってクラス全体が XML/JSON に変換されるのを確認できることを私は知っています。ただし、これは私のアプリケーションのすべてのシナリオに適しているわけではありません。クラスを XML にマーシャリングすることが常に適切であるとは限りません。いくつかのフィールドなどだけが必要な場合もあれば、ドメイン モデルでは表されないカスタム要素をオンザフライで追加できるようにしたい場合もあります。

どうやってそれをしますか?これには他のフレームワークを使用する必要がありますか? GSON を見つけたばかりですが、見る価値はありますか? リソースの XML 表現はそれほど重要ではありません。GSON を使用している場合、Web サービスは何を応答すればよいですか? それでは、戻り値の型として String を使用しますか?

疑似コード、GSON はまだ見ていません。

@Produce("application/json")
public String someMethod() {
   return gson.toJSON();
}
4

2 に答える 2

2

多変種の応答タイプがある場合、多くの場合、戻り値として javax.ws.rs.core.Response を使用するのが最善です。これにより、ラップされて返される実際のエンティティを実行時に完全に制御できます。

次に、リソース メソッドが呼び出されたときに、コア ビジネス オブジェクトを返すか、ビジネス オブジェクトのラッパーを返すか、カスタムのシリアル化されたバージョン (文字列として) を返すかを決定できます。大まかな擬似コード:

@Produce("application/json")
public Response someMethod() {

    switch(mySpecialCase) {
        case 1:
            return Response.ok(coreEntity).build(); break;
        case 2:
            return Response.ok(new LiteEntity(coreEntity)).build(); break;
        case 3:
            return Response.ok(Util.toGSON(coreEntity).toString()).build(); break;
    }
}

このアプローチの利点の 1 つは、サーバー側のインターセプターが起動してエンティティ オブジェクトの変換を実行するため、JSON および XML へのオンザフライ シリアライゼーションを引き続き利用できると同時に、変換を回避できることです。 、エンティティ タイプとして文字列を使用します。

于 2012-11-17T15:46:30.577 に答える
1

文字列ではなく、型を返す必要があります。
例えば:

@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
  return personDao.getPerson();
}


jersey-json jarに (たとえば maven を介して) 依存関係を追加してください
。Jersey で JSON のサポートを開始するには、次のように web.xml も変更する必要があります。

<init-param>
  <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
  <param-value>true</param-value>
</init-param>

私のソリューションでは、 Person クラスの特別な注釈を実行する必要がないことに注意してください。

于 2012-11-17T15:46:51.093 に答える