为数据密集型Web服务提供精细数据

时间:2015-07-22 18:01:09

标签: java design-patterns

我正在开发一个真正数据密集的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。

在服务器端,我正在考虑使用命令模式实现它,为每个枚举命令并仅在列表中存在相应的枚举时执行它。

  • 这里我的D将是一个立面。
  • 如果请求粒度数据,则不要使用facade而是使用X命令。

问题我能想到:

  • 我的命令太多了。
  • 如果命令是另一个命令的子集,并且两者都被请求执行超级命令(我们需要在代码中执行此操作)

有没有更好的方法来解决这个问题。

(PS:由于某些用例,我不想将它分解为较小的API)。

1 个答案:

答案 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);