有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为数据密集型web服务提供细粒度数据

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

过于简化的回答可能如下所示:

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

        }
        y,
        z
    }
}

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

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

问题: 有没有更好的方法来输入(而不是枚举)调用方需要的数据

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

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

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

我能想到的问题是:

  • 我的命令太多了
  • 如果一个命令是另一个命令的子集,并且两个命令都被请求,那么只执行超集命令(我们需要在代码中这样做)

有没有更好的办法解决这个问题

(注:由于某些用例,我对将其拆分成更小的API不感兴趣)


共 (1) 个答案

  1. # 1 楼答案

    如果使用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);