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