gpt4 book ai didi

Java仅返回父类(super class)的属性

转载 作者:行者123 更新时间:2023-12-02 09:49:12 24 4
gpt4 key购买 nike

我正在尝试使用 java 和 spring boot 创建一个 API Controller 。我想从特定 API 端点以 JSON 形式返回特定对象,到目前为止没有什么特别的。现在我有一个子类A和一个父类B。B是抽象的,A不是抽象的,但是A包含的属性比B多。我必须将父类(super class)的属性从A传递到API端点,但是当我强制转换时从一个对象到父类(super class)的对象,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 端点生成的 JSON 代码如下所示:

[
{
"name": "CONTENT",
"description": "CONTENT",
"moreInformation": "CONTENT"
},
...
]

我通过使用@JsonIgnore注释A类的属性找到了解决这个问题的可能方法。但本帖的主要问题并不局限于这种特殊的实现:是否可以只获取父类A的属性而不注解子类?

最佳答案

我相信您的选择是:

  • @JsonIgnore 在您不想在 A 中序列化的字段上。
  • 将 Jackson ObjectMapper 配置为 only serialize annotated fields然后用 @JsonProperty 注释您想要在 B 中序列化的字段。
  • 将从 getAllRelevantAsAsList() 返回的 A 实例复制到没有字段的新对象类型中(委托(delegate)给 a 的 B 的匿名实现,或者创建一个新的对象类型)扩展 B 但没有新字段并具有 A 实例的复制构造函数的子类。

    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仅返回父类(super class)的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44603200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com