Spring 用 JsonView / MappingJacksonValue 包装 rest 控制器结果
Spring rest controller result wrapping with JsonView / MappingJacksonValue
我有一个 Spring API 允许用户使用视图参数指定每个调用的 JsonView,如下所示:
/api/v1/person/1?view=viewName
然后我使用 Spring 的 MappingJacksonValue 来动态设置正确的视图,而不是使用 @JsonView()
注释,最后我只是 return MappingJacksonValue 实例,它产生了一些东西
[
{ id: 1 },
{ id: 2 }
]
我这辈子都想不出如何轻松地将我的 MappingJacksonValue 实例包装在一个 ObjectNode 中,以便我可以将上面代码片段中的所有 API 结果更改为这个
{
"data" : [
{ id: 1 },
{ id: 2 }
]
}
我尝试使用常规的 HashMap<>,但这没有用 - 序列化完全忽略了 MappingJacksonValue 视图,它还会生成特定于 Map 的结果
{
data: {
value: [],
serializationView: "com.blah.models.view.View$Id",
filters: null,
jsonpFunction: null
}
}
有人可以告诉我在我的场景中实现结果包装的最佳方法是什么吗?
提前致谢!
如果有人遇到这个 post 想做同样的事情,我意识到我以错误的方式看待问题。我最终创建了一个 ServiceResponse class 并像这样
将对象包裹在那里
public class ServiceResponse {
@JsonView(View.Id.class)
private Object data;
public ServiceResponse (Object data) {
this.data = data;
}
}
所以基本上我没有返回 new MappingJacksonValue(someReturnObject)
,而是返回 new MappingJacksonValue(new ServiceResponse(someReturnObject))
。这样一切都很好地包装在 data
JSON 对象中,并且 setSerializationView
方法仍然正确地过滤我的对象。
希望这对某人有所帮助。
我有一个 Spring API 允许用户使用视图参数指定每个调用的 JsonView,如下所示:
/api/v1/person/1?view=viewName
然后我使用 Spring 的 MappingJacksonValue 来动态设置正确的视图,而不是使用 @JsonView()
注释,最后我只是 return MappingJacksonValue 实例,它产生了一些东西
[
{ id: 1 },
{ id: 2 }
]
我这辈子都想不出如何轻松地将我的 MappingJacksonValue 实例包装在一个 ObjectNode 中,以便我可以将上面代码片段中的所有 API 结果更改为这个
{
"data" : [
{ id: 1 },
{ id: 2 }
]
}
我尝试使用常规的 HashMap<>,但这没有用 - 序列化完全忽略了 MappingJacksonValue 视图,它还会生成特定于 Map 的结果
{
data: {
value: [],
serializationView: "com.blah.models.view.View$Id",
filters: null,
jsonpFunction: null
}
}
有人可以告诉我在我的场景中实现结果包装的最佳方法是什么吗?
提前致谢!
如果有人遇到这个 post 想做同样的事情,我意识到我以错误的方式看待问题。我最终创建了一个 ServiceResponse class 并像这样
将对象包裹在那里public class ServiceResponse {
@JsonView(View.Id.class)
private Object data;
public ServiceResponse (Object data) {
this.data = data;
}
}
所以基本上我没有返回 new MappingJacksonValue(someReturnObject)
,而是返回 new MappingJacksonValue(new ServiceResponse(someReturnObject))
。这样一切都很好地包装在 data
JSON 对象中,并且 setSerializationView
方法仍然正确地过滤我的对象。
希望这对某人有所帮助。