我正在使用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;
}
}
该方法效果很好,但它不是很干净,并且使事情变得更加复杂(例如,当我必须返回列表时),因为我总是必须包装原始类。
我没有找到一个方法来指定要序列化哪些字段而不修改(而且我不能)原始类。
有什么帮助吗?
不要使用包装器类,而是为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);
希望对您有所帮助,