0

我在Java SpringBoot 1.5.7中有一个场景,我有多个类,我希望能够通过继承对每个类应用不同的 JsonView。

 ClassA{

    @JsonView({SummaryView.class})
    public String name;

    @JsonView({DetailView.class})
    public String description;

    public interface SummaryView{}

    public interface DetailView extends SummaryView {}
 }

Class A 是 Class B 中的一个属性,ClassB 只有在使用 ClassB 的 DetailView JsonView 时才应该序列化为 Json。

 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 只使用直接类,即ClassCClassB,但ClassA 属性不包含在生成的 Json 中。结果是:

{
  "name": "classC",
  "description": "Has submodel Class B",

  "classB": {
    "name": "classB",
    "description": "Has submodel ClassA",

    "classA": { }
  }
}

我还尝试将最外层的 JsonView 类放在最内层的类中,即。在ClassA 属性中有@JsonView(ClassC.DetailView.class)但它也不起作用。

我想要的结果是:

{
  "name": "classC",
  "description": "Has submodel Class B",

  "classB": {
    "name": "classB",
    "description": "Has submodel ClassA",

    "classA": {
      "name": "classA"
    }
  }
}

我如何让这个工作?

4

1 回答 1

0

我知道以下不是答案。但是,我复制了您的类和视图层次结构。当我用给定的视图显式调用杰克逊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"
    }
  }
}
于 2018-01-16T09:27:52.943 回答