Java 如何使用父类在SpringREST控制器具体类中返回?

Java 如何使用父类在SpringREST控制器具体类中返回?,java,rest,spring-mvc,Java,Rest,Spring Mvc,我有一个a类和两个B、C类,它们是a的混凝土类 class A { private int id; //get/set } class B extends A { private String attributeB; //get/set } class C extends A { private String attributeC; //get/set } class AService { @Autowired ADao

我有一个a类和两个B、C类,它们是a的混凝土类

class A {
    private int id;
    //get/set
}

class B extends A { 
    private String attributeB;
    //get/set
}

class C extends A {
    private String attributeC;
    //get/set
}

class AService {
    @Autowired  
    ADao aDao; 
    public List<A> list() {
        return aDao.list();
    }
}
class RestController {
    @Autowired
    AService aService;

    @RequestMapping("api/a")
    public List<A> list() {
        return aService.list(); //Return a List<A> with A, B and C objects
    }
}
但是第二个和第三个是B和C对象,响应应该是

[
    { id: 1},
    { id: 2, attributeB: "B"},
    { id: 3, attributeC: "C"},
]
它对我有用

控制器

// mind the annotation here
@RestController
public class Controller {

    @RequestMapping("api/a")
    public List<A> list() {
        List<A> listA = new ArrayList<A>();
        listA.add(new A());
        listA.add(new B());
        listA.add(new C());
        return listA;
    }
}
Jackson库应位于类路径上,以便进行序列化/反序列化。
要避免任何依赖性问题,请从下载一个示例项目,添加web依赖项并生成项目。

它适合我

控制器

// mind the annotation here
@RestController
public class Controller {

    @RequestMapping("api/a")
    public List<A> list() {
        List<A> listA = new ArrayList<A>();
        listA.add(new A());
        listA.add(new B());
        listA.add(new C());
        return listA;
    }
}
Jackson库应位于类路径上,以便进行序列化/反序列化。
为了避免任何依赖性问题,请从下载一个示例项目,添加web依赖项并生成项目。

我尝试了一个来自like@Hemant-tell的示例,但效果很好,不幸的是,在我的项目中,我没有使用spring boot,所以我使用

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "name")
@JsonSubTypes({ @JsonSubTypes.Type(value = A.class),
    @JsonSubTypes.Type(value = B.class) })
class A {}

class B extends A {}
class C extends A {}
现在它开始工作了

感谢大家的帮助。

我尝试了一个来自like@Hemant-tell的例子,但效果不错,不幸的是,在我的项目中,我没有使用spring boot,所以我解决了使用

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "name")
@JsonSubTypes({ @JsonSubTypes.Type(value = A.class),
    @JsonSubTypes.Type(value = B.class) })
class A {}

class B extends A {}
class C extends A {}
现在它开始工作了


感谢大家的帮助。

问题并不完全清楚,因此我猜您正在尝试检索一个响应主体,该主体应该重新运行对象列表。即

@RequestMapping(value = "api/getObjectList")
@ResponseBody
public List<ClassA> getObjectList() {
    List<ClassA> testList = new ArrayList<>();
    testList.add(new ClassA());
    testList.add(new ClassB());
    testList.add(new ClassC());
    return testList;
}
B类: 公共类ClassB扩展了ClassA{

    private String propertyB;

    public ClassB() {
        this.propertyB = "B";
    }

    //get/set
}
C类:

@JsonInclude(Include.NON_NULL)
public class ClassC extends ClassA {

    private String propertyC;

    public ClassC() {
        this.propertyC = "C";
    }

    //get/set
}
到目前为止,这段代码还不错,当您通过GET方法在本地环境中测试它时,应该会生成以下json:

您说您恰好使用了jackson parser v2.6+,因此如果您使用的是jackson parser,则可能是您排除了空属性的序列化

在上面的示例中,我初始化了默认构造函数中的所有属性!但是,如果删除了初始化的变量并尝试返回null字段,它将不会为ClassC对象属性返回null值,因为映射器设置为忽略null值

然而,我的看法是,您可能已经注意到了这一点,并且更有可能是您或其他人在其他地方为空值设置了全局忽略


如果你不是使用它的人,如果其他人在同一个项目上“玩了一点”,你可能希望参与到这个问题中来,这个问题并不完全清楚,所以我猜你是在试图检索一个应该重新运行对象列表的响应体

@RequestMapping(value = "api/getObjectList")
@ResponseBody
public List<ClassA> getObjectList() {
    List<ClassA> testList = new ArrayList<>();
    testList.add(new ClassA());
    testList.add(new ClassB());
    testList.add(new ClassC());
    return testList;
}
B类: 公共类ClassB扩展了ClassA{

    private String propertyB;

    public ClassB() {
        this.propertyB = "B";
    }

    //get/set
}
C类:

@JsonInclude(Include.NON_NULL)
public class ClassC extends ClassA {

    private String propertyC;

    public ClassC() {
        this.propertyC = "C";
    }

    //get/set
}
到目前为止,这段代码还不错,当您通过GET方法在本地环境中测试它时,应该会生成以下json:

您说您恰好使用了jackson parser v2.6+,因此如果您使用的是jackson parser,则可能是您排除了空属性的序列化

在上面的示例中,我初始化了默认构造函数中的所有属性!但是,如果删除了初始化的变量并尝试返回null字段,它将不会为ClassC对象属性返回null值,因为映射器设置为忽略null值

然而,我的看法是,您可能已经注意到了这一点,并且更有可能是您或其他人在其他地方为空值设置了全局忽略


如果你不是使用它的人,如果其他人“玩了一点”在同一个项目中,您可能希望参与

您的意思是什么?如果序列化为json,它将包括,前提是A、B、C包含属性的setter/getter I调用RestController中的api,但即使对象是B或C,它也只返回A属性object@HemantPatel我编辑了这个问题,我忘了o write我有getter/setters方法。这不是a。你的意思是什么?如果序列化为json,它将包括,前提是a、B、C包含setter/getter属性我在RestController中使用api调用,但即使对象是B或C,它也只返回a属性object@HemantPatel我编辑了问题,忘了写了我有getter/setters方法。这不是一个问题。这与其说是一个答案,不如说是一个问题不好的证明。我记得OP最初已经发布了这个问题。但是序列化对他不起作用。所以这似乎是一个库问题。我使用的是com.fasterxml.jackson.core version 2.6.4->jackson core->jackson databind这并不是那么多我记得OP最初已经发布了这个问题。但是序列化对他不起作用。所以这似乎是一个库问题。我正在使用com.fasterxml.jackson.core version 2.6.4->jackson core->jackson databind