我正在将SpringBoot / Hibernate用于我的应用程序框架。 我有一个为我的应用程序保存大量参数的类。它具有一些始终适用的参数,并且根据所处理的内容而有所不同(每个项目的参数)。它已被建模为包含一系列子类的父类,根据特定的上下文(例如,正在开发的项目,但实际案例具有确定“活跃”孩子的更为复杂的逻辑)。
在几乎所有情况下,我只想序列化当时适用的一个孩子,但是在少数情况下,我想序列化整个集合。
我可以使用以下方法实现它:
public class Parent {
@JsonView(JsonViews.AllChildren.class)
private Set<Child> children= new HashSet<>();
@JsonIgnore
private Context context;
public void setContext (Context context) {
this.context = context;
}
@JsonView(JsonViews.ActiveChild.class)
@JsonProperty("activeChild")
public Child getActiveChild() {
for (Child child : this.children) {
if (someFunction(this.context)) {
return child;
}
}
return null;
}
然后在我的控制器中可以执行以下操作:
@GetMapping("/parent")
@JsonView(JsonViews.AllChildren.class)
public Parent getParent() {
return ParentService.getParent();
}
@GetMapping("/parent/{context}")
@JsonView(JsonViews.ActiveChild.class)
public Parent getParentWithContext(PathVariable final String contextName)) {
Context context = ContextService.getContextByName(contextName);
Parent parent = ParentService.getParent();
parent.setContext(context);
return Parent;
}
效果很好,但是引入了一些我想避免的状态(在父级上设置上下文)。
所以现在的问题是:我该如何序列化父/子类以删除状态属性,例如像这样:
@JsonView(JsonViews.ActiveChild.class)
@JsonProperty("activeChild")
public Child getActiveChild(Context context) {
for (Child child : this.children) {
if (someFunction(context)) {
return child;
}
}
return null;
}
@GetMapping("/parent/{context}")
@JsonView(JsonViews.ActiveChild.class)
public Parent getParentWithContext(PathVariable final String contextName)) {
Context context = ContextService.getContextByName(contextName);
Parent parent = ParentService.getParent();
// How to tell the Json serialization to pass the context to getActiveChild
return Parent;
}
我发现的有关Json Context序列化的所有内容似乎都具有一组固定的上下文(消除了一个未知列表),可用于从输出中添加/删除属性,而不是过滤数据。
到目前为止,我发现的唯一解决方案是自己调用ObjectMapper以获得所有子项的完整json序列化,然后除去我要返回的子项之外的所有子项。但这意味着我有重复的“逻辑上有哪个孩子在该上下文中活动”逻辑集-一个在Parent类中用于Parent和Child对象,另一个在getParentWithContext函数中用于json表示。我能做些更好的事情吗?