Как получить множественное наследование 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"
    }
  }
}
Другие вопросы по тегам