Как настроить пользовательский сериализатор для конечной точки 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. Если у вас нет острой необходимости ограничить информацию (например, в целях безопасности), отдавайте предпочтение согласованному типу возвращаемого значения и позволяйте вызывающему абоненту игнорировать информацию, не имеющую отношения к нему.

Другие вопросы по тегам