Как настроить пользовательский сериализатор для конечной точки API (приложения Spring) с определенной аннотацией?
Допустим , у меня есть контроллер с конечной точкой.
@controller
public class booksController{
@SomeCustomAnnotation
public String getBookOnlyName(){
return new book();
}
public String getBookAllData(){
return new book();
}
}
В объекте книги мне нравится сериализовать только некоторые поля.
class book{
@JsonView(Views.someClass.class)
public String name;
public String author;
}
Теперь я хочу сериализовать только поле "имя" из экземпляра книги. И только из конечной точки с аннотацией типа "getBookOnlyName"
1 ответ
По умолчанию свойства, явно не отмеченные как часть представления, сериализуются. Следовательно, вы должны аннотировать только те свойства, которые хотите отображать условно, например, с помощью представления с именем Подробный:
public class Book {
public String name;
@JsonView(Views.Detailed.class)
public String author;
}
Тогда в вашем контроллере нет необходимости в специальной аннотации. Просто повторно используйте ту же аннотацию, например:
@RestController
public class BooksController {
public Book getBookSummary() {
return new Book(...);
}
@JsonView(Views.Detailed.class)
public Book getBookDetail() {
return new Book(...);
}
}
Обратите внимание, что в обоих случаях вы все равно возвращаете Книгу; просто один будет содержать меньше свойств, чем другой.
Тем не менее, будьте осторожны, чтобы не переусердствовать, поскольку это может стать головной болью при поддержке и надлежащем документировании конечных точек API. Если у вас нет острой необходимости ограничить информацию (например, в целях безопасности), отдавайте предпочтение согласованному типу возвращаемого значения и позволяйте вызывающему абоненту игнорировать информацию, не имеющую отношения к нему.