我正在开发一个真正数据密集的Web服务。 不幸的是,所有呼叫都不需要它返回的所有数据,但可能需要另一个呼叫。
过于简化的响应可能如下所示:
Response : { A, B, C, D : { X : { } y, z } }
我希望为调用者提供灵活性,以便他们可以从大对象请求特定数据。 我想通过暴露枚举,并将枚举列表作为输入来实现它。每个枚举映射到响应中的字段。
示例如果调用者只需要A和D,那么他们可以通过传递像ImmutableList.of这样的枚举列表来指定它(GET_ENUM_A,GET_ENUM_D) 在Web服务端,我只能计算A和D.
问题: 有没有更好的方法来获取调用者需要什么数据的输入(除了枚举)?
我想通过更细粒度的数据来控制用户,例如。他们可以指定需要D的哪个部分。 GET_ENUM_D_X。
在服务器端,我正在考虑使用命令模式实现它,为每个枚举命令并仅在列表中存在相应的枚举时执行它。
问题我能想到:
有没有更好的方法来解决这个问题。
(PS:由于某些用例,我不想将它分解为较小的API)。
答案 0 :(得分:0)
如果您使用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);