Spring 数据 MongoDB 如何在实体上设置字段?

How are fields set on an entity by Spring Data MongoDB?

我有一个 MongoRepository class

public interface UserRepository extends MongoRepository<User, Long> {

  User findById(Long id);
}

我的实体 pojo 看起来像这样

@Document(collection = "user")
class User {

  Long id;
  String name;
  Department department;
  …
}

当我调用 findBy 方法时,返回了一个 User 对象。我想知道 Spring Data MongoDB 如何将 DBObject 转换为 Java 对象。我的印象是 Spring Data MongoDB 在后台使用某种映射器(Jackson?),它会调用 java(Entity) [=] 的 setters/constructors 方法 class 基于 class 或 @Field 注释中的字段名称。但令我惊讶的是,setter 从未被调用过。仅调用默认构造函数。

那么字段是怎么设置的呢?我问的原因是如果设置器被调用,它会给我一个设置其他字段的选项。

谢谢

Spring 在它下面的后续层有一个实体转换器。它使用反射来读取字段类型、变量和签名。转换逻辑对所有数据存储库都是通用的。您可以阅读大致相同的 here

您也可以引入自定义转换器,无论是您自己的还是 jackson,例如 here

Spring 数据默认为字段访问,因为访问器方法可以包含我们不想意外触发的额外逻辑。如果那是你真正想要的,你可以通过用 @AccessType(Type.PROPERTY).

注释你的 class 来切换到 属性 访问

看看 MappingMongoConverter class - 它具有执行所有这些操作的逻辑。