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 - 它具有执行所有这些操作的逻辑。
我有一个 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)
.
看看 MappingMongoConverter class - 它具有执行所有这些操作的逻辑。