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
,