2016-07-11 2 views
0

У меня есть объект с несколькими полями и с JsonView указанным:Spring Jackson JsonViews - Получить поля на основе 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 возвращается без каких-либо элементов.

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

ответ

0

Вы можете попытаться получить доступ и ознакомиться с аннотациями полей в классе с 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.

Смежные вопросы