Java Jackson与多接口继承

Java Jackson与多接口继承,java,json,inheritance,jackson,Java,Json,Inheritance,Jackson,我试图根据使用的接口将单个实体的json序列化实现为不同的视图。 例如,我们有: public interface BookBrief { long getId(); String getTitle(); } public interface BookPreview { long getId(); String getAnnotation(); } public class Book implements BookBrief, BookPreview { // clas

我试图根据使用的接口将单个实体的json序列化实现为不同的视图。 例如,我们有:

public interface BookBrief {
  long getId();
  String getTitle();
}

public interface BookPreview {
  long getId();
  String getAnnotation();
}

public class Book implements BookBrief, BookPreview {

  // class fields here

  public long getId() {...}

  public String getTitle() {...}

  public String getText() {...}

  public String getAnnotation() {...}

  // setters here
}


// service which results is serialized to json in Spring MVC controllers

public interface BookService {

  List<? extends BookBrief> getBooks();

  BookPreview getBookPreview(long id);

  Book getBook(long id);
}
公共界面书籍简介{
长getId();
字符串getTitle();
}
公共界面书籍预览{
长getId();
字符串getAnnotation();
}
公共类图书实现了图书简介、图书预览{
//这里的类字段
公共长getId(){…}
公共字符串getTitle(){…}
公共字符串getText(){…}
公共字符串getAnnotation(){…}
//这里的二传手
}
//结果在SpringMVC控制器中序列化为json的服务
公共接口图书服务{

列表似乎有两个选项:

  • 编写自定义的Jackson序列化程序
  • 使用Jackson视图,这看起来是一个更可行的选择(可以找到完整的文档)
  • 使用视图可通过3个简单步骤实现:

  • 定义视图标记:
  • bookview.java

    public class BookViews {
    
        public static class BookBrief { }
    
        public static class BookPreview { }
    
    }
    
    public class Book {
    
        @JsonView({BookViews.BookBrief.class, BookViews.BookPreview.class})
        private long id;
    
        @JsonView(BookViews.BookBrief.class)
        private String title;
    
        @JsonView(BookViews.BookPreview.class)
        private String annotation;
    
        // Constructors and getters/setters
    }
    
    @Path("books")
    public class BookService {
    
        private static final List<Book> library = Arrays.asList(
                new Book(1, "War and Peace", "Novel"),
                new Book(2, "A Game of Thrones", "Fantasy")
        );
    
        @GET
        @Path("all")
        @JsonView(BookViews.BookBrief.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBooks() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
        @GET
        @Path("previews")
        @JsonView(BookViews.BookPreview.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBookPreviews() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
    }
    
  • 注释要在每个视图中显示的图书字段:
  • Book.java

    public class BookViews {
    
        public static class BookBrief { }
    
        public static class BookPreview { }
    
    }
    
    public class Book {
    
        @JsonView({BookViews.BookBrief.class, BookViews.BookPreview.class})
        private long id;
    
        @JsonView(BookViews.BookBrief.class)
        private String title;
    
        @JsonView(BookViews.BookPreview.class)
        private String annotation;
    
        // Constructors and getters/setters
    }
    
    @Path("books")
    public class BookService {
    
        private static final List<Book> library = Arrays.asList(
                new Book(1, "War and Peace", "Novel"),
                new Book(2, "A Game of Thrones", "Fantasy")
        );
    
        @GET
        @Path("all")
        @JsonView(BookViews.BookBrief.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBooks() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
        @GET
        @Path("previews")
        @JsonView(BookViews.BookPreview.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBookPreviews() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
    }
    
  • 用JSonValue注释REST方法并指定要使用的视图:
  • BookService.java

    public class BookViews {
    
        public static class BookBrief { }
    
        public static class BookPreview { }
    
    }
    
    public class Book {
    
        @JsonView({BookViews.BookBrief.class, BookViews.BookPreview.class})
        private long id;
    
        @JsonView(BookViews.BookBrief.class)
        private String title;
    
        @JsonView(BookViews.BookPreview.class)
        private String annotation;
    
        // Constructors and getters/setters
    }
    
    @Path("books")
    public class BookService {
    
        private static final List<Book> library = Arrays.asList(
                new Book(1, "War and Peace", "Novel"),
                new Book(2, "A Game of Thrones", "Fantasy")
        );
    
        @GET
        @Path("all")
        @JsonView(BookViews.BookBrief.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBooks() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
        @GET
        @Path("previews")
        @JsonView(BookViews.BookPreview.class)
        @Produces(MediaType.APPLICATION_JSON)
        public Response getBookPreviews() {
            return Response.status(Response.Status.OK).entity(library).build();
        }
    
    }
    
    获取:


    您能否展示一个示例,说明如何使用定制的jackson序列化程序实现这一点,正如您在第一个选项中提到的那样。