提问者:小点点

Spring Boot和Jackson:定义要在外部类上序列化的字段


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

问题是:我使用在无法编辑的库中定义的外部Hibernate实体类。这个类非常复杂,当我返回带有其余 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();
}
}

并按如下方式使用包装

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

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

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

有什么帮助吗?


共2个答案

匿名用户

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

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

这里的最大优点是将DB层与API层分离,这使其更加灵活和易于管理。

你可以在这里阅读更多关于这种模式的信息

匿名用户

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

例如,请参阅此答案。

这个想法是用你想要的注释创建一个类,并使用objectMapper.getSerializationConfig(). addMixInAnnoations()将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);

希望对您有所帮助,