我目前正在研究返回的宁静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/