【问题标题】:Is it possible to build an object like this at runtime in java?是否可以在运行时在 java 中构建这样的对象?
【发布时间】:2016-11-23 01:51:41
【问题描述】:

正如标题所说......

我想构建一个包含四个字段变量的 POJO,并在某些运行时事件中创建此 POJO 的实例,并可能访问其中的两个或三个字段。

public class Category implements Serializable {

    private String name;

    private String description;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

假设我创建了一个新的 Category 对象,但我只想能够在运行时访问 name 字段。有没有我可以用来实现这一目标的设计模式?我考虑了策略模式并查看了构建器,但我仍然很困惑是否可以在 java 中做到这一点。

基本上,总体目标是从数据库中获取对象并将其作为 jax rs 中的 JSON 响应返回。但有时我不希望返回一个完整的对象,而只是说在某些运行时事件期间可以访问一半的对象。如果这似乎是一个愚蠢的问题,我深表歉意,但我知道我想做什么,但不知道最好的方法。

【问题讨论】:

  • 对于大多数 ORM 工具,通常您要么引入整个对象,要么什么都不引入。那么是说您希望设置器的访问级别在运行时更改?
  • 好的,既然您在谈论 JSON,您可能正在寻找 JSON 投影。我知道 Spring 和 Jackson 支持它们,但我对 JAX-RS 了解不多。
  • Projections 正是我所需要的......问题是我可以不使用弹簧而只使用杰克逊......
  • 也许您可以动态地将 mixins 添加到包含 @JsonIgnore 某些字段的杰克逊。或者你只是写一个可配置的序列化器/反序列化器。

标签: java oop jackson jax-rs


【解决方案1】:

我和你有同样的问题,我的项目用的是springmvc,json工具是jackson。问题解决了,我就用@JsonIgnore。更多详情,看jackson-how-to-prevent-field-serialization

【讨论】:

  • 我需要能够更改对象在运行时的序列化和反序列化方式。据我了解,@JsonIgnore 将始终阻止该字段可序列化。
【解决方案2】:

因此,如果我错了或看到比这更好的选择,请有人纠正我...对于很多对象,这可能是用于序列化和反序列化的大量额外代码...杰克逊规定是我所需要的。我可以在字段变量上使用注释 @JsonView(DummyClass.class)。除非其他人发布了更好的回复,否则我会在一两天内接受此最佳答案。

  // View definitions:
  class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

  public class Bean {
            // Name is public
            @JsonView(Views.Public.class) String name;
            // Address semi-public
            @JsonView(Views.ExtendPublic.class) Address address;
            // SSN only for internal usage
            @JsonView(Views.Internal.class) SocialSecNumber ssn;
  }

有了这样的视图定义,序列化可以这样完成:

  // short-cut:
  objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

  // or fully exploded:
  objectMapper.getSerializationConfig().setSerializationView(Views.Public.class);
  // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse)
  objectMapper.writeValue(out, beanInstance); // will use active view set via Config

  // or, starting with 1.5, more convenient (ObjectWriter is reusable too)
  objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);

此信息来自http://wiki.fasterxml.com/JacksonJsonViews

使用 jackson 2.3,我可以使用 JAX-RS 做到这一点

   public class Resource {

      @JsonView(Views.Public.class)
      @GET
      @Produces(MediaType.APPLICATION_JSON )
      public List<Object> getElements() {
        ...
        return someResultList;
      }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多