Spring Jackson JsonViews - 基于JsonView获取字段

时间:2016-07-11 12:21:01

标签: java spring jackson json-view

我有一个拥有多个字段且指定了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,我不希望客户更新该字段。

我已阅读订单帖子,必须首先加载客户端手动完成,然后相应地更新参数(在我的情况下为clientIdname)。

现在我想获得一个需要更新的字段列表(即标有JsonView的字段为Views.ClientView.class)。我尝试了以下但是它没有工作:

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

但是,attributes在没有任何元素的情况下返回。

有没有办法根据视图获取这个字段列表?

1 个答案:

答案 0 :(得分: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