2

シナリオ

  • RESTful Web サービス要求用の Jersey/JacksonJson。
  • プロパティ X、Y、Z を持つエンティティ A。
  • 2 つの RESTful 要求。
  • リクエスト 1 は、JSON レスポンスでプロパティ X、Y を持つエンティティ A を返す必要があります
  • リクエスト 2 は、JSON レスポンスでプロパティ X、Y、Z を持つエンティティ A を返す必要があります
  • エンティティ A は、プロパティ Z が @JsonIgnore を使用するように構成されているため、JSON 応答で返されません。

問題

エンティティで @JsonIgnore に設定されている場合、リクエスト 2 でプロパティ Z を返すにはどうすればよいですか? @JsonIgnoreを使用する以外に、これを動的に行うより良い方法はありますか? 以下は、私の質問を明確にするための「デモ」コードです。

@Entity
Class A implements Serializable {
  String X;
  String Y;
  String Z;

  @JsonIgnore
  public String getZ() {
    return Z;
  }
}

@Path("form")
Class Request {
    @GET
    @Path("request1")
    @Produces({"application/json"})
    public A request1() {
      return A;
    }

    @GET
    @Path("request2")
    @Produces({"application/json"})
    public A request2() {
      return A;
    }
}
4

4 に答える 4

2

@JsonView注釈を使用できます。

何かのようなもの:

public class Views {
    public static class BasicView {
    }

    public static class FullView extends BasicView {
    }
}

次に、クラスAで、

  @JsonView(Views.BasicView.class)
  public String getX() {
    return X;
  }


  @JsonView(Views.BasicView.class)
  public String getY() {
    return Y;
  }


  @JsonView(Views.FullView.class)
  public String getZ() {
    return Z;
  }

ただし、JSON を返す必要がある場合は、カスタムのビューベースObjectWriterの s を使用してそれらをシリアル化する必要があります。

public static final ObjectWriter basicObjectWriter = objectMapper
            .writerWithView(Views.BasicView.class);
public static final ObjectWriter fullObjectWriter = objectMapper
            .writerWithView(Views.FullView.class);

すると、とbasicObjectWriter.writeValueAsString(responseObject)だけが書かれ​​ます。 と書きます。XYfullObjectWriter.writeValueAsString(responseObject)XYZ

于 2013-09-19T18:33:53.060 に答える
0

あなたはJersey/JAX-RSを使用していると言うので、Yogaは特に興味深いはずです。

Yoga は、JAX-RS および SpringMVC RESTful サーバーを拡張して、GData および LinkedIn スタイル フィールド セレクターを提供します。

  • 通話時に表示するフィールドを選択します
  • 複雑なビューの 1 回の呼び出しでエンティティ関係をナビゲートする
于 2013-09-19T21:19:26.930 に答える