4

ネストされたエンティティに @JsonView アノテーションを使用しようとしています。より明確にするために、2 つのエンティティがあり、各エンティティには独自のビュー クラスがあるとします。

public class JsonViewAddress {
     //some view classes
}


public class Address {
   //fields annotated by JsonViewAddress's classes and @JsonProperty
}

public class JsonViewPerson {
  //some view classes
}

public class Person {

 //some fields (yes annotated with JsonViewPerson classes and @JsonProperty)

 //also assume that this is annotated with any JsonViewPerson's class.
 private Address address;

}

レスポンスからJson型でこのPersonクラスを実現してみましょう

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(value = { /* WHAT SHOULD BE WRITTEN HERE ? */ })
   public Response method() {
       //return Person entity in response
   }
}

@JsonView アノテーションは String 配列を取りますが、これらの記述されたビュー クラスが所属するエンティティごとに明示的に機能する必要があることをどのように判断すればよいですか? UserView が User に対して機能し、AddressView が Address に対して機能することをすぐに確認したいと思います。

ありがとう。

4

1 に答える 1

6

私は同様の問題を抱えていました。それはまさにあなたの問題ではありませんが、おそらくこのアプローチはあなたにとって役立つでしょう。

ViewObject を 1 つだけ使用する

public class Views {

    public static class Low {
    }

    public static class Medium extends Low {
    }

    public static class High extends Medium {
    }
}

ネストされたオブジェクトがあるたびに、Views.Low ビューでそれが必要になるため、これを行うためにシリアライザーを作成します。

public class Serializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.writerWithView(Views.Low.class).writeValue(jgen, value);
    }
} 

最後に、私のオブジェクトでは次のように使用しました:

public class Person {

   @JsonView(Views.High.class)
   @JsonSerialize(using = Serializer.class)
   private Address address;

}

リソース:

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(Views.High.class)
   public Response method() {
       //return Person entity in response with address low view
   }

   @GET
   @Path("/stack/overflow")
   @JsonView(Views.Medium.class)
   public Response method() {
       //return Person entity in response with no address
   }

}

このアプローチを問題に使用できますが、異なるクラス ビューを使用する場合は、多くのシリアライザーを作成する必要があります。

于 2015-03-04T15:20:10.620 に答える