【问题标题】:Java return only attributes of superclassJava 只返回超类的属性
【发布时间】: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的属性而不注子类?

【问题讨论】:

标签: java json rest api inheritance


【解决方案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());
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多