我们有一个前端服务,它使用后端服务来获取Metric对象列表。我们为后端服务编写了一个Java ClientSDK,以便更轻松地开发该服务的客户端应用程序。
我们还会从前端服务公开指标列表。目前,我们直接将后端Metric对象公开并转换为JSON。
我担心的是,如果对后端Metric对象进行了更改 - 比如说开发人员添加了新的密码ID字段 - 我们不希望从前端服务公开它。
我们还为前端服务编写了clientSDK。我们不想从后端clientSDK引用Metric类,因此逻辑选项是在前端SDK中定义类似的Metric对象。
我不想浪费CPU周期将1000个度量标准从一个类定义复制到另一个类定义。
有没有办法指定我应该从后端Metric向Metric的前端定义公开哪些字段,因为我转换为JSON?更好的是,我可以将前端定义引用到JSON转换器,因为我要求它封送后端对象吗?
我们正在将Jackson与Spring rest框架用于上下文,但我很乐意将其放在心跳中,因为通过注释对对象进行编组似乎是导致此问题的根本原因。
答案 0 :(得分:3)
看看Jackson's JsonView构造。
我可以看到你的例子看起来像这样:
class Views {
static class Client {}
static class Backend extends Client {}
}
public class Metric {
@JsonView(Views.Client.class) String metricName;
@JsonView(Views.Client.class) String count;
@JsonView(Views.Backend.class) String secretKey;
}
从Spring 4.1起,Spring @JsonView
注释方法支持@ResponseBody
注释。
答案 1 :(得分:0)
正如Nicholas Hausschild建议您可以通过编组/解组框架的注释来实现此目的。
但是你可以像这样简单地使用继承和转换:
class SomeSuperClass {
String exposeThis;
String exposeThat;
// getters and setters...
}
class SomeSubClass extends SomeSuperClass {
String doNotExposeThis;
// getters and setters...
}
这样,您可以在将对象返回到JSON解析器时强制转换为超类,同时在内部使用子类来携带您不想要公开的其他信息。
答案 2 :(得分:0)
另一种可能性是使用Mixins
,因此您可以在不触及原始DTO
的情况下定义不同的方案。
我自己使用我编写的库来动态实现:
https://github.com/Antibrumm/jackson-antpathfilter
这适用于不太深的图形,否则有人在这里以类似的方式编写了另一种方法,这些方案看起来更有效,但行为有点不同。