Spring Jackson JsonViews - Получить поля на основе JsonView

У меня есть сущность с несколькими полями и с указанным JsonView:

public class Client {

   @JsonView(Views.ClientView.class)
   @Column(name = "clientid")
   private long clientId;

   @JsonView(Views.ClientView.class)
   @Column(name = "name")
   private String name

   @JsonView(Views.SystemView.class)
   @Column(name = "istest")
   private boolean istest;
   .........

}

Представления определяются следующим образом:

public class Views {

  public interface SystemView extends ClientView {
  }

  public interface ClientView {
  }
}

У меня также есть простой контроллер для обновления клиента. Так как поле istest установлен в SystemViewЯ не хочу, чтобы клиент обновил это поле.

Я прочитал в порядке сообщений, что это должно быть сделано вручную, сначала загрузив клиент, а затем соответственно обновив параметры (в моем случае clientId а также name).

Теперь я хочу получить список полей, которые мне нужно обновить (т.е. поля, отмеченные JsonView как Views.ClientView.class). Я пробовал следующее, но это не работает:

ObjectReader reader = objectMapper.readerWithView(SystemView.class);
ContextAttributes attributes = reader.getAttributes();

Но, attributes возвращается без каких-либо элементов.

Есть ли способ получить этот список полей на основе вида?

1 ответ

Вы можете попытаться получить доступ и проверить аннотации полей в классе с помощью Reflection нравится:

List<Field> annotatedFields = new ArrayList<>();
Field[] fields = Client.class.getDeclaredFields();
for (Field field : fields) {
    if (!field.isAnnotationPresent(JsonView.class)) {
        continue;
    }
    JsonView annotation = field.getAnnotation(JsonView.class);
    if (Arrays.asList(annotation.value()).contains(Views.SystemView.class)) {
        annotatedFields.add(field);
    }
}

В приведенном выше примере annotatedFields будет содержать список полей в Client класс с пометкой JsonView со значением содержит Views.SystemView.class,

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