Java Jackson与多接口继承
我试图根据使用的接口将单个实体的json序列化实现为不同的视图。 例如,我们有: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
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序列化程序实现这一点,正如您在第一个选项中提到的那样。