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

标签 java design-patterns

我正在开发一个数据密集型的网络服务。 不幸的是,所有调用都不需要它返回的所有数据,但另一个调用可能需要它。

过于简化的响应可能如下所示:

Response : {
    A,
    B,
    C,
    D : {
        X : {

        }
        y,
        z
    }
}

我想为调用者提供灵 active ,以便他们可以从大对象请求特定数据。 我想通过公开枚举并将枚举列表作为输入来实现它。每个枚举映射到响应中的一个字段。

如果调用者只需要 A 和 D,那么他们可以通过传递枚举列表来指定它,例如 ImmutableList.of(GET_ENUM_A, GET_ENUM_D) 在 Web 服务端我只能计算 A 和 D。

问题: 是否有更好的方法来获取调用者所需数据的输入(除了枚举)?

我想让用户控制更细粒度的数据,例如。他们可以指定需要 D 的哪一部分。 GET_ENUM_D_X。

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

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

我能想到的问题:

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

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

(PS:由于某些用例,我对将其分割为较小的 API 不感兴趣)。

最佳答案

如果您使用 Jackson 来序列化您的对象,您可以利用 View :

http://wiki.fasterxml.com/JacksonJsonViews

基本上,您定义一个 View 类,然后在序列化对象时,您将传入所需的 View 。例如:

// 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
        }
}

然后,当你想要序列化时,你可以传入你想要的 View :

objectMapper.writeValueUsingView(out, beanInstance, A.class);

如果你想同时获得 a 和 c,你可以使用 AC 类

objectMapper.writeValueUsingView(out, beanInstance, AC.class);

关于java - 为数据密集型 Web 服务提供精细数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570672/

相关文章:

c# - 有没有一种方法可以强制方法遵循特定的方法签名?

java - 类的全局字段

c# - c# for Unity3D 中基于任务的序列管理器

java - 安卓磨损 : Is there any reason to use a Time object rather than a Calendar object?

java - 我想使用 Java 将子元素插入 xml 树中的子元素

java - JApplet通过Eclipse连接本地Mysql,但不能通过Web浏览器连接

c# - 有没有比使用层次结构更好的显示对象的方法?

c++ - 对象必须包含指针成员才能与其他对象通信吗?

java - java web start 可以在没有 JRE 的设备上运行吗?

java线程同步问题,如何实现observable线程