【问题标题】:Spring Boot and Jackson: Define which fields to serialize on external classSpring Boot 和 Jackson:定义要在外部类上序列化的字段
【发布时间】:2020-01-21 07:49:08
【问题描述】:

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

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

实际上,我已经解决了使用包装类包装原始类的问题,该包装类只公开我想从控制器返回的值。

例如:

原班

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();
}
}

并使用 Wrapper 如下

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

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

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

有什么帮助吗?

【问题讨论】:

标签: java rest spring-boot jackson


【解决方案1】:

不使用包装类,而是为其余 API 创建一个比 DB 实体更精简的 DTO 对象和一个从实体创建 DTO(反之亦然)的转换器

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

这里最大的优势是您将 DB 层与 API 层分开,这使其更加灵活且易于管理。

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

【讨论】:

    【解决方案2】:

    显然,您可以使用Jackson Mixins 使用 Jackson 注释来注释类。

    例如,参见this answer

    我们的想法是使用您想要的注释创建一个类,并使用objectMapper.getSerializationConfig().addMixInAnnotations() 将 MixIn 注册到您的类。

    例如:

    //Class you don't controll
    public class User {
      private String name;
      private String password; //attribute we want to omit
    
      //... getters and setters
    }
    
    public abstract class UserMixIn {
      @JsonIgnore String getPassword();
    }
    
    objectMapper.addMixInAnnotations(User.class, UserMixIn.class);
    

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 2017-09-09
      • 1970-01-01
      • 2019-04-03
      • 2020-01-09
      • 2023-01-26
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多