【问题标题】:How are fields set on an entity by Spring Data MongoDB?Spring Data MongoDB 如何在实体上设置字段?
【发布时间】:2016-12-08 00:11:10
【问题描述】:

我有一个 MongoRepository 类

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?),它会根据类中的字段名称或 @Field Annotation 调用 java(Entity) 类的 setters/constructors 方法。但令我惊讶的是,setter 从未被调用过。仅调用默认构造函数。

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

谢谢

【问题讨论】:

  • 是否有将日期保存为字符串的具体原因?
  • 您好,感谢您的回复。这是我正在读取的一些外部数据库。我无法控制它。 :)

标签: mongodb spring-data spring-data-mongodb


【解决方案1】:

Spring Data 默认为字段访问,因为访问器方法可以包含我们不想意外触发的额外逻辑。如果这是您真正想要的,您可以通过使用 @AccessType(Type.PROPERTY) 注释您的类来切换到属性访问。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您好,感谢您的回复。我查看了链接并尝试实现我自己的转换器。但它没有帮助。基本上我需要转换一个日期字段。在 mongo 中,它存储为字符串。但是在我的 pojo(Entity class) 中,我想将其映射为 Date 或 LocalDateTime。但是当我为 String 编写一个到 LocalDateTime 的转换器时,Spring 尝试将 DBObject 中的每个 String 字段转换为 LocalDateTime。如何仅将特定字段转换为不同类型?谢谢
    【解决方案3】:

    看看MappingMongoConverter 类 - 它有做这一切的逻辑。

    【讨论】:

    • 这个类目前有两千多行,很难理解。也许你可以通过解释课程的哪些部分与问题相关来改进你的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多