是否有可能在运行时在java中构建这样的对象?

时间:2016-07-20 01:24:56

标签: java oop jackson jax-rs

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

我想构建一个包含四个字段变量的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响应返回。但有时我不希望返回一个完整的对象,但只允许说某些运行时事件期间可以访问的对象的一半。如果这看起来像一个愚蠢的问题,我很抱歉,但我知道我想做什么但却不知道最好的方法。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我的项目使用的是springmvc,json工具是jackson。问题解决了,我只使用@JsonIgnore。有关详细信息,请阅读jackson-how-to-prevent-field-serialization

答案 1 :(得分:1)

所以有人纠正我,如果我错了或看到比这更好的选择...有很多对象,这可能是很多额外的序列化和反序列化的代码......杰克逊规定是我需要的。我可以在字段变量上使用注释@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;
      }
    }