gpt4 book ai didi

java - Spring Boot 和 Jackson : Define which fields to serialize on external class

转载 作者:行者123 更新时间:2023-11-30 05:28:36 24 4
gpt4 key购买 nike

我正在使用 spring boot 和 hibernate 开发一个 Rest api 项目,我想知道如何使用 Jackson 对 RestController 进行 json 序列化。

问题是:我使用在无法编辑的库中定义的外部 hibernate 实体类。这些类非常复杂,并且定义了很多当我使用其余 api 返回对象时我不感兴趣的字段。

实际上,我已经解决了用包装类包装原始类的问题,该包装类仅公开我想要从 Controller 返回的值。

例如:

原始类

class AccountEntity {
///...

public String getName() {
return this.name;
}

/// ... Lot of code here
}

包装类:

class AccountWrapper {

AccountEntity original;

public AccountWrapper(AccountEntity original) {
this.original = original;
}

public String getName() {
return this.original.getName();
}
}

并按如下方式使用包装器

@RestController("/api/user")
public class UsersController {
@GetMapping("/")
public AccountWrapper getUser() {
AccountEntity account = //get account in some way
AccountWrapper accountWrapper = new AccountWrapper(account);
return accountWrapper;
}
}

该方法效果很好,但它不是很干净并且使事情变得更加复杂(例如,当我必须返回列表时),因为我总是必须包装原始类。

我没有找到一种方法让我能够指定要序列化的字段而不修改(而且我不能)原始类。

有什么帮助吗?

最佳答案

不要使用包装类,而是为其余 API 创建一个比数据库实体更精简的 DTO 对象,并创建一个从实体创建 DTO 的转换程序(反之亦然)

与此处使用包装器的区别在于,数据库实体不是 DTO 的一部分,因此不需要在响应上进行序列化。

这里的一大优点是将数据库层与 API 层分开,这使得它更加灵活且易于管理。

您可以阅读有关此模式的更多信息 here

关于java - Spring Boot 和 Jackson : Define which fields to serialize on external class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025204/

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