2

Jackson 2.0 では、JAX-RS リソースを@JsonView.

次の例は、リソース応答で人の年齢を無視する方法を示しています。残念ながら、すべての JAX-RS メソッドには で注釈を付ける必要があり@JsonViewます。

public class View {
  public static class Public {}
  public static class Private {}
}

public class People {
  @JsonView(View.Public) String name;
  @JsonView(View.Private) int age;
}

@Path("/people")
public class PeopleResource {
  @GET
  @JsonView(View.Public)
  public List<People> get() {
    return peoples.get();
  }

  @GET
  @Path("/id")
  @JsonView(View.Public)
  public People get(@PathParam("id") int id) {
    return people.get(id);
  }
}

アプリケーション リソースをグローバルにフィルター処理する唯一の方法は、MixIn を使用することです。

public class PeopleMixIn {
  @JsonIgnore int age;
}

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
  private ObjectMapper mapper = new ObjectMapper();

  public ObjectMapperProvider() {
    mapper.addMixInAnnotations(People.class, PeopleMixIn.class);
  }

  public ObjectMapper getContext(Class<?> type) { return mapper; }
}

Jackson の ObjectMapper を JsonView で構成する方法はありますか? または、リソース/アプリケーションのすべてのメソッドにフィルターを適用しますか?

4

1 に答える 1

1

Resource アノテーションを処理するコードの一部である Jackson JAX-RS プロバイダーをサブクラス化できます。またはStreamingOutput、手動で を使用してObjectWriter、呼び出しごとに使用するビューを指定できます。

2.0 では、ObjectMapperその状態をスレッドセーフな方法で変更することはできませんが、ObjectWriter不変の性質により完全にスレッドセーフであるため、その状態を減らすことが目標です。しかし、JAX-RS プロバイダーはまだObjectWriter/を使用していませんObjectReader

別のアイデア: Jackson JAX-RS providerにRequest For Enhancement (RFE) を提出して、そのような機能を追加することができます ("setDefaultView()"?)。これは、ユースケースに最適なソリューションのように思えますか? また、実装は非常にシンプルである必要があるため、これは 2.1.0 リリースに含まれる可能性があり、数週間以内にリリースされる予定です。

于 2012-09-19T21:16:10.343 に答える