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 只返回超类的属性的主要内容,如果未能解决你的问题,请参考以下文章

深度解析:java必须掌握的知识点——类的重用

Java入门

Java中类的继承

API 平台:规范化映射超类仅包括来自超类的属性,不包括子类

Java的Object类

如何使用 Jsdoc 描述超类中定义的扩展类的属性