Java 如何使用父类在SpringREST控制器具体类中返回?
我有一个a类和两个B、C类,它们是a的混凝土类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
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