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

标签 java rest spring-boot jackson

我正在使用 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/

相关文章:

hibernate - Spring-boot & hibernate,使用事务

java - Spring boot @PathVariable 不能包含斜杠/分号/百分号字符

java - 在谷歌应用引擎和 GET 中使用 SOAP 网络服务

java - 使用 REST API 时出现内部服务器错误

java - 在 Spring REST 服务中优雅地处理无效文件上传

mysql - 无法使用仅主机网络连接到在 Virtualbox ubuntu 虚拟机上运行的 mysql 数据库

java - 如何将字节数组写入流程构建器的 OutputStream (Java)

java - 将 Epoch 值转换为 12 小时格式的时间戳

java - 使用传真调制解调器调用电话

java - 在 Matlab 调用的 java 方法中使用可变参数