我正在开发一个真正的数据密集型web服务。不幸的是,它返回的所有数据并不是所有调用都需要,但可能在另一个调用中需要。
一个过于简化的回复可能看起来像下面这样:
<>之前响应:{一个,B,C,D: {X: {}y,z}}之前我想为调用者提供灵活性,这样他们就可以从大对象请求特定的数据。我想通过暴露枚举来实现它,并将枚举列表作为输入。每个枚举映射到响应中的一个字段。
如果调用者只需要A和D,那么他们可以通过传递像immutableelist这样的枚举列表来指定它。(GET_ENUM_A GET_ENUM_D)在web服务端,我只能计算A和d。问题:是否有更好的方法来输入(除了enum)调用者需要的数据?
我想让用户控制更细粒度的数据,例如:他们可以指定需要D的哪一部分。GET_ENUM_D_X .
在服务器端,我正在考虑使用命令模式实现它,对每个enum都有一个命令,只有在列表中存在相应的enum时才执行它。
- 这里我的D将是一个立面
- 如果请求粒度数据,那么不要使用facade,而是使用command for x。
我能想到的问题:
- 命令太多了。
- 如果一个命令是另一个命令的子集,并且两个命令都被请求,则只执行超集命令(我们需要在代码中这样做)
有更好的方法来解决这个问题吗?
(PS:由于某些用例,我对将其分割成更小的api不感兴趣)。
如果你正在使用Jackson来序列化你的对象,你可以利用视图的优势:
http://wiki.fasterxml.com/JacksonJsonViews基本上,你定义一个视图类,然后当序列化对象时,你会传入你想要的视图。例如:
// View definitions:
class Views {
static interface A { }
static interface B { }
static interface C { }
static class AC implements A, C { }
}
public class Bean {
@JsonView(Views.A.class)
public Object getA() {
// compute A
}
@JsonView(Views.B.class)
public Object getB() {
// compute B
}
@JsonView(Views.C.class)
public Object getC() {
// compute C
}
}
然后,当你想要序列化时,你可以传入你想要的视图:
objectMapper.writeValueUsingView(out, beanInstance, A.class);
如果想同时得到a和c,可以使用AC类
objectMapper.writeValueUsingView(out, beanInstance, AC.class);