Java只返回超类的属性
我正在尝试用java和spring引导创建一个API控制器。我想从特定的API端点以JSON的形式返回特定的对象,到目前为止没有什么特别的。现在我有一个子类a和一个父类B。B是抽象的,a不是抽象的,但a包含的属性比B多。我必须将超类的属性从a传递到API端点,但是当我将a对象强制转换到超类的对象时,JSON代码始终包含a的属性 除了将不相关的部分设置为null或空元素之外,还有其他方法可以防止这种情况吗Java只返回超类的属性,java,json,rest,api,inheritance,Java,Json,Rest,Api,Inheritance,我正在尝试用java和spring引导创建一个API控制器。我想从特定的API端点以JSON的形式返回特定的对象,到目前为止没有什么特别的。现在我有一个子类a和一个父类B。B是抽象的,a不是抽象的,但a包含的属性比B多。我必须将超类的属性从a传递到API端点,但是当我将a对象强制转换到超类的对象时,JSON代码始终包含a的属性 除了将不相关的部分设置为null或空元素之外,还有其他方法可以防止这种情况吗 编辑: 我有以下代码: @Entity public abstract class B {
编辑: 我有以下代码:
@Entity
public abstract class B {
private String name;
private String description;
/* GETTERS AND SETTERS */
}
@Entity
public class A extends B {
private String moreInformation;
/* GETTERS AND SETTERS */
}
@RestController
@RequestMapping("/api/v1/")
public class ApiController {
@RequestMapping(value = "/Bs", method = RequestMethod.GET)
public ResponseEntity<List<B>> getBs() {
List<A> As = DAO.getAllRelevantAsAsList();
List<B> Bs = new ArrayList<>();
Bs.appendAll(As);
return new ResponseEntity<>(Bs, HttpStatus.OK);
}
/* DIFFERENT API ENDPOINTS */
}
通过用@JsonIgnore注释类a的属性,我找到了解决这个问题的可能方法。但是这个线程的主要问题不限于这个特殊的实现:是否可以只获取父类A的属性而不注释子类?我相信您的选项是:
关于不希望在A中序列化的字段@JsonIgnore
- 将Jackson ObjectMapper配置为,然后使用
注释您希望在B中序列化的字段@JsonProperty
- 将从
返回的A实例复制到一个没有字段的新对象类型中(或者是委托给A的B的匿名实现,或者创建一个扩展B但没有新字段的新子类,并为A实例创建一个复制构造函数)getAllRelevantasList()
List<B> Bs = DAO.getAllRelevantAsAsList() .stream() .map(a -> new B() { public String getName() { a.getName(); } public void setName(String name) { a.setName(name); } /** other delegated getters and setters **/ }).collect(Collectors.toList());
List Bs=DAO.getAllRelevantasList() .stream() .map(a->new B(){ 公共字符串getName(){a.getName();} public void setName(字符串名称){a.setName(名称);} /**其他委托的接受者和接受者**/ }).collect(Collectors.toList());
List<B> Bs = DAO.getAllRelevantAsAsList()
.stream()
.map(a -> new B() {
public String getName() { a.getName(); }
public void setName(String name) { a.setName(name); }
/** other delegated getters and setters **/
}).collect(Collectors.toList());