我目前正在研究返回的宁静Web服务,例如List<ConfidentialData>。 (我使用此ConfidentialData作为此问题的示例)

假设此ConfidentialData定义如下:

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


现在,我正在使用jackson,它在后台将List<ConfidentialData>转换为JSON并将其作为Response发送。

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

我有3个解决方案:


为page1和page2构造一个单独的域对象。


恐怕该解决方案的伸缩性不是很好,因为可能会有更多页面需要ConfidentialData的稍有不同的构成,并且最终我会膨胀我的域对象。

只需保留一个域对象并构造JSON-通过添加特定页面所需的其他成员即可。


我可以看到在这种情况下我必须使用JSON。 (但我也意识到,存在像GSON这样的复杂库可以使我的生活变得轻松)

我可以简单地创建一个单个域对象,该对象将包含page1,page2,page3等所需的所有内容。 (并且在需要时,我将继续向此ConfidentialData域对象添加任何其他成员)


我非常反对这种方法,因为我们谈论的有关机密数据的其他成员不容易计算。在某些情况下,可能是与ConfidentialData相关的某些统计信息,并且计算这些统计信息在计算上将非常昂贵。当UI永远不会使用它时,我不希望我的简单API调用完成所有这些计算(例如,在page1的情况下)



我可以看到第一种和第二种方法的明显缺点。
我的问题是在处理此类情况时提供良好服务的良好实践是什么?

为什么不操作JSON:


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


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

最佳答案

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

关于java - 从Restful服务返回的最佳实践-返回Java对象与返回手动构建的JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61134696/

10-10 05:08