从 Restful 服务返回时的最佳实践 - 返回 Java 对象与返回手动构建的 JSON



我目前正在研究返回的 restful Web 服务,比如说一个List<ConfidentialData>。(我用这个ConfidentialData作为这个问题的例子)

假设此ConfidentialData定义如下:

@Getter
@Setter
public class ConfidentialData {
private Integer id; // unique-identifier
private String data;
private String creationDate;
private String approvalDate;
}

现在,我正在使用杰克逊,它在幕后将此List<ConfidentialData>转换为 JSON 并将其作为Response发送。

现在,UI 中的不同组件需要不同的ConfidentialData状态。假设我的一个 UI 页面(比如 page1)需要纯ConfidentialData对象(在 JSON 中没有任何额外的成员),而另一个页面(比如 page2)需要ConfidentialData对象和一些额外的成员(假设这些成员与ConfidentialData的一些统计信息相关。这些统计信息实际上并不属于ConfidentialData对象,而是在 page2 要求时添加)。

我有 3 个选择:

  • 为页面 1 和页面 2 构造一个单独的域对象。
    • 恐怕这个解决方案的可扩展性不强,因为可能有更多的页面需要稍微不同的ConfidentialData组成,我最终会膨胀我的域对象。
  • 只需保留一个域对象并构造 JSON - 通过添加特定页面所需的其他成员。 我
    • 可以看到在这种情况下我将不得不使用 JSON。(但我也知道存在像 GSON 这样的复杂库,这将使我的生活变得轻松)
  • 我可以简单地创建一个域对象,该对象将包含 page1、page2、page3 等所需的所有内容。(如果需要,我会继续向这个ConfidentialData域对象添加任何其他成员)
    • 我非常反对这种方法,因为我们谈论的机密数据的额外成员不容易计算。在某些情况下,它可能是一些与ConfidentialData相关的统计信息,计算这些统计信息的计算成本很高。我不希望我的简单 API 调用执行所有这些计算,当 UI 永远不会使用它时(例如,在 page1 的情况下)

我可以看到第一种方法和第二种方法的明显缺点。 我在这里的问题是,在处理这种情况的休息服务方面,什么是良好做法。

为什么不操纵 JSON:

  • 另外,我不太赞成使用 JSON,因为我们的 java 权限过滤器(这是一个拦截器 - 它拦截来自服务的响应,并根据用户的权限对列表进行一些过滤)然后必须调整JsonArray以进行过滤,而不是简单地过滤List<ConfidentialData>
  • 但鉴于我们拥有像 GSON 这样的复杂库,过滤可能很容易。
  • 此外,由于过滤只能在ConfidentialData#getId()的基础上进行(这永远不会改变),我可以考虑继续使用基于 JSON 的方法,这种方法目前在可扩展性方面看起来很有希望。

我可以将其视为操作 JSON 和创建多个域对象之间的权衡。行业内是否有任何标准来处理这种情况?

根据服务的调用方式,可以仅填充ConfidentialData的相应属性,而保留其他属性不变。在序列化期间,可以省略任何未设置的属性。这可以通过提供序列化库的适当元数据来实现,无论是 Jackson 还是 Gson。

最新更新