【问题标题】:How to use Mongo Java driver @BsonCreator annotation?如何使用 Mongo Java 驱动程序 @BsonCreator 注解?
【发布时间】:2018-08-07 19:53:15
【问题描述】:

我正在尝试将 不可变 对象从 MongoDB 映射到我的 Java POJO,但我不断收到以下错误:

org.springframework.web.util.NestedServletException: 
Request processing failed; 
nested exception is java.lang.RuntimeException: 
org.mongodb.morphia.mapping.MappingException: 
No usable constructor for com.example.model.Item

似乎在使用不可变对象时,我需要使用@BsonCreator 进行注释,但这似乎不起作用,我相信这可能是因为使用此注释需要我以某种方式配置org.bson.codecs.pojo.Conventions#ANNOTATION_CONVENTION。也许我是盲人,但我似乎无法在任何地方找到任何关于如何配置它的示例。任何帮助将不胜感激。这是我带注释的 POJO:

@Value /* Lombok auto generates getters */
@Builder /* Lombok auto generates builder method */
public class Item implements Serializable {
    private final @NotNull AnEnum type;
    private final int refId;
    private final int quantity;

    @BsonCreator
    public Item(@BsonProperty("type") AnEnum type,
                @BsonProperty("refId") int refId,
                @BsonProperty("quantity") int quantity) {
        this.type = type;
        this.refId = refId;
        this.quantity = quantity;
    }
}

【问题讨论】:

  • 您使用的是 Morphia 还是纯 Java 驱动程序? @BsonCreator 是驱动程序的一部分,但您添加了 [morphia] 关键字。

标签: java mongodb spring-boot morphia mongo-java-driver


【解决方案1】:

这肯定适用于 POJO 支持。我刚刚做了一个test case on github,它通过了。

我注意到两个问题:

  1. implements Serializable 应该不是必需的

  2. 您需要为这 3 个字段指定 getter,以便自动编解码器生成器正确提取它们。

【讨论】:

  • 感谢您的回答。我的问题是我没有意识到哪些注释是哪个库的一部分,所以我将 Morhpia 中的注释与 Spring 数据和 mongo 驱动程序混合在一起。当我转移到 Spring 数据的映射注释 @Document 时,这不是问题,因为它似乎不需要注释,只要我为不可变的多参数对象创建了一个私有的、看似无用的、无参数构造函数。
【解决方案2】:

尝试添加一个空的构造函数,似乎 Morphia 需要这些,至少在我的项目中它有帮助。如果它为您解决了问题,请告诉我。

【讨论】:

  • 添加默认构造函数绝对有效,并且是一种可用的解决方法,但是感觉很混乱。开发人员似乎专门为此目的提供了@BsonCreator,但似乎缺少文档和示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
相关资源
最近更新 更多