Java 只返回超类的属性
Posted
技术标签:
【中文标题】Java 只返回超类的属性【英文标题】:Java return only attributes of superclass 【发布时间】:2017-11-20 01:18:48 【问题描述】:我正在尝试使用 java 和 spring boot 创建一个 API 控制器。我想从特定的 API 端点以 JSON 形式返回特定的对象,到目前为止没有什么特别的。现在我有一个子类A和一个父类B。B是抽象的,A不是抽象的,但是A包含的属性比B多。我必须将超类的属性从A传递到API端点,但是当我转换时超类对象的对象 JSON 代码始终包含来自 A 的属性。
除了将不相关的部分设置为 null 或空元素之外,还有其他方法可以防止这种情况发生吗?
编辑:
我有以下代码:
@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 */
API Endpoint 生成的 JSON 代码如下所示:
[
"name": "CONTENT",
"description": "CONTENT",
"moreInformation": "CONTENT"
,
...
]
我通过使用@JsonIgnore 注释类A 的属性找到了解决此问题的可能方法。但是这个线程的主要问题不限于这个特殊的实现:是否可以只获取父类A的属性而不注子类?
【问题讨论】:
你用的是什么 JSON 序列化库? fasterxml 杰克逊库 您需要显示您尝试过的代码... 解决方案之一是编写自定义序列化程序。 baeldung.com/jackson-custom-serialization 【参考方案1】:我相信您的选择是:
@JsonIgnore
在您不想在 A 中序列化的字段上。
将 Jackson ObjectMapper 配置为 only serialize annotated fields,然后在 B 中使用 @JsonProperty
注释您想要序列化的字段。
将从getAllRelevantAsAsList()
返回的 A 实例复制到没有字段的新对象类型中(委托给 a 的 B 的匿名实现,或者创建扩展 B 但没有字段的新子类新字段并具有 A 实例的复制 ctor。
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());
【讨论】:
以上是关于Java 只返回超类的属性的主要内容,如果未能解决你的问题,请参考以下文章