【问题标题】:Spring Jackson JsonViews - Get Fields based on JsonViewSpring Jackson JsonViews - 基于 JsonView 获取字段
【发布时间】:2016-11-13 09:23:01
【问题描述】:

我有一个包含多个字段并指定了 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 没有任何元素返回。

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

【问题讨论】:

    标签: java spring jackson json-view


    【解决方案1】:

    您可以尝试使用Reflection likes 访问和检查类中字段的注释:

    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

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2019-02-27
      • 2015-06-25
      • 2016-06-04
      • 2020-12-22
      • 2015-10-30
      • 2012-05-01
      • 2018-01-31
      • 2014-10-23
      相关资源
      最近更新 更多