Как получить множественное наследование JsonView
У меня есть сценарий в Java SpringBoot 1.5.7, где у меня есть несколько классов, и я хочу иметь возможность применять разные JsonViews к каждому через наследование, как.
ClassA{
@JsonView({SummaryView.class})
public String name;
@JsonView({DetailView.class})
public String description;
public interface SummaryView{}
public interface DetailView extends SummaryView {}
}
Класс A является свойством в классе B. Класс B должен быть сериализован в Json только при использовании DetailView JsonView из Class B.
ClassB{
@JsonView({SummaryView.class})
private String name;
@JsonView({DetailView.class})
private String description;
@JsonView({DetailView.class})
private ClassA classA;
public interface SummaryView{}
public interface DetailView extends SummaryView, ClassA.SummaryView {}
}
Класс B также является свойством класса C.
ClassC{
@JsonView({SummaryView.class})
private String name;
@JsonView({DetailView.class})
private String description;
@JsonView({DetailView.class})
private ClassB classB;
public interface SummaryView{}
public interface DetailView extends SummaryView, ClassB.DetailView {}
}
В моем сценарии реальной жизни у меня может быть до 5 уровней наследования. В моем контроллере отдыха я хочу использовать разные представления. Когда я использую представление ClassC.DetailView.class, JsonView просто работает с непосредственным классом, то есть ClassC иClass B, носвойства Class A не включаются в результирующий Json. Результат:
{
"name": "classC",
"description": "Has submodel Class B",
"classB": {
"name": "classB",
"description": "Has submodel ClassA",
"classA": { }
}
}
Я также попытался поместить классы JsonView из самого внешнего класса в самый внутренний класс,т.е.Наличие @JsonView(ClassC.DetailView.class) в свойствах Class A, но это также не работает.
Мне желаемый результат является:
{
"name": "classC",
"description": "Has submodel Class B",
"classB": {
"name": "classB",
"description": "Has submodel ClassA",
"classA": {
"name": "classA"
}
}
}
Как мне заставить это работать?
1 ответ
Я знаю, что следующее не является ответом. Однако я скопировал ваш класс и просмотр иерархии. Когда я явно призываю Джексона ObjectMapper
с заданным видом, я получаю желаемый результат (используя последнюю версию Джексона, 2.9.3)
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class TestJsonViewInheritence
{
public static void main(String[] args) {
try {
ObjectMapper mapper = new ObjectMapper();
mapper
.enable(SerializationFeature.INDENT_OUTPUT)
.writerWithView(ClassC.DetailView.class)
.writeValue(System.out, new ClassC());
} catch (Exception e) {
e.printStackTrace();
}
}
public static class ClassA
{
@JsonView({ SummaryView.class })
public String name = "ClassA";
@JsonView({ DetailView.class })
public String description = "Has no submodel";
public interface SummaryView {}
public interface DetailView extends SummaryView {}
}
public static class ClassB
{
@JsonView({ SummaryView.class })
private String name = "ClassB";
@JsonView({ DetailView.class })
private String description = "Has submodel ClassA";
@JsonView({ DetailView.class })
private ClassA classA = new ClassA();
public interface SummaryView {}
public interface DetailView extends SummaryView, ClassA.SummaryView {}
}
public static class ClassC
{
@JsonView({ SummaryView.class })
private String name = "ClassC";
@JsonView({ DetailView.class })
private String description = "Has submodel ClassB";
@JsonView({ DetailView.class })
private ClassB classB = new ClassB();
public interface SummaryView {}
public interface DetailView extends SummaryView, ClassB.DetailView {}
}
}
выход:
{
"name" : "ClassC",
"description" : "Has submodel ClassB",
"classB" : {
"name" : "ClassB",
"description" : "Has submodel ClassA",
"classA" : {
"name" : "ClassA"
}
}
}