Spring Boot:将 JSON 响应包装在动态父对象中
我有一个与后端微服务通信的 REST API 规范,它返回以下值:
关于“集合”响应(例如 GET /users):
{
users: [
{
... // single user object data
}
],
links: [
{
... // single HATEOAS link object
}
]
}
关于“单个对象”响应(例如):GET /users/{userUuid}
{
user: {
... // {userUuid} user object}
}
}
选择这种方法是为了使单个响应是可扩展的(例如,如果在下面获得额外的查询参数,例如,我们将有额外的请求信息)。GET /users/{userUuid}
?detailedView=true
从根本上说,我认为这是一种可以最大限度地减少API更新之间重大更改的好方法。但是,将此模型转换为代码被证明是非常艰巨的。
假设对于单个响应,我为单个用户提供了以下 API 模型对象:
public class SingleUserResource {
private MicroserviceUserModel user;
public SingleUserResource(MicroserviceUserModel user) {
this.user = user;
}
public String getName() {
return user.getName();
}
// other getters for fields we wish to expose
}
此方法的优点是,我们只能公开具有公共 getter 的内部使用模型中的字段,而不能公开其他字段。然后,对于集合响应,我将具有以下包装类:
public class UsersResource extends ResourceSupport {
@JsonProperty("users")
public final List<SingleUserResource> users;
public UsersResource(List<MicroserviceUserModel> users) {
// add each user as a SingleUserResource
}
}
对于单个对象响应,我们将具有以下各项:
public class UserResource {
@JsonProperty("user")
public final SingleUserResource user;
public UserResource(SingleUserResource user) {
this.user = user;
}
}
这将生成根据本文顶部的API规范格式化的响应。这种方法的好处是,我们只公开那些我们想要公开的字段。沉重的缺点是,我有大量的包装类四处飞来飞去,除了被Jackson读取以产生正确格式的响应之外,它们不执行任何可识别的逻辑任务。JSON
我的问题如下:
我怎么可能推广这种方法?理想情况下,我希望有一个我的所有模型都可以扩展的单个类(也许是一个类),但是看到Jackson似乎如何从对象定义中派生JSON键,我必须使用一些类似于在运行时向基本响应类添加字段的东西 - 这是一个肮脏的黑客,我想尽可能远离人类。
BaseSingularResponse
BaseCollectionsResponse extends ResourceSupport
Javaassist
有没有更简单的方法来实现这一目标?不幸的是,一年后,我可能会在响应中拥有数量可变数量的顶级JSON对象,因此我无法使用像Jackson那样的东西,因为它将所有内容包装到单个根级对象中(据我所知)。
SerializationConfig.Feature.WRAP_ROOT_VALUE
有没有类似类级别的东西(而不仅仅是方法和字段级别)?
@JsonProperty