web-dev-qa-db-ja.com

JacksonのJSON Viewクラスとは何ですか?

ジャクソンの@JsonView(Views.MyClass.class)が何なのかわかりません。私はこの方法でPOJOのフィールドとメソッドに注釈を付けることができることを知っています注釈のないものをフィルタリングするために JSONでシリアル化されることから。しかし、Views.Myclassクラスとは何ですか? Jacksonライブラリのテンプレートクラスですか?

そして、Viewsクラス内に多くのクラスがあるのはなぜですか?たとえば、次のようなものです。

 class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

なぜそれが必要で、どのように機能しますか?

15
IngeniousTom

@JsonViewを使用して、シリアル化のコンテキストに応じてフィールドをフィルタリングします。 RESTクライアントにデータを返すとき、どのRESTサービスが呼び出されたかに応じて、同じデータモデルを使用している間にシリアル化されるデータを制限する必要があります。

2つのRESTサービスを作成したいとしましょう:

最初のサービスは、姓や名などのユーザー情報を返しますが、それに添付されたメッセージは返しません。

2番目のサービスは、最初のサービスからのすべての情報と、現在のユーザーに添付されたメッセージを返します。

@JsonViewアノテーション付きのサンプルPOJOクラス

ユーザーPojoクラス

@JsonView(User.Views.Public.class)
    public String getFirstname() {
        return firstname;
    }

 @JsonView(User.Views.Public.class)
    public String getLastname() {
        return lastname;
    }

メッセージPojoクラス

@JsonView(User.Views.Internal.class)
    public List<Message> getMessages() {
        return messages;
    }

レストコントローラー

@RestController
public class SimpleRestController {

    @Autowired
    SimpleService simpleService;

    @RequestMapping(value = "/user/public", method = RequestMethod.GET)
    @JsonView(User.Views.Public.class)
    public User getUserWithPublicData() {
        return simpleService.loadUser();
    }


    @RequestMapping(value = "/user/internal", method = RequestMethod.GET)
    @JsonView(User.Views.Internal.class)
    public User getUserWithInternalData() {
        return simpleService.loadUser();
    }
}
38
Gangadhar