如何在spring-data-mongodb中获取@Indexed(unique = true)失败

时间:2017-09-24 06:26:26

标签: java mongodb exception spring-boot spring-data-mongodb

我正在使用Spring-Boot 1.5.1MongoDB 3.4.6

我有一个MongoDB文档,在某些字段上有一些@Indexed(unique=true)注释。

@Document(collection="Product")
public class Product{
    @Id
    private String id;
    @Indexed(unique=true)
    private String name;
    @Indexed(unique=true)
    private String searchName;

当有任何重复的名称或searchName时,它会抛出org.springframework.dao.DuplicateKeyException

Stacktrace:

Caused by: org.springframework.dao.DuplicateKeyException: E11000 duplicate key error index: Product.name  dup key: { : "name" }; nested exception is com.mongodb.MongoException$DuplicateKey: E11000 duplicate key error index: Product.name dup key: { : "name" }
at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:52)

我们如何获得抛出异常的密钥。

类似于我们将@NotNull(message = "Product briefDescription cannot be null")放在某个字段上的情况,它会在message中为您提供exception,但message没有@Indexed属性注解。

有什么办法吗?

3 个答案:

答案 0 :(得分:7)

异常消息包含您要求的信息,它包括引发错误的索引的名称(在您的情况下为Product.nameProduct.searchName)。< / p>

不幸的是,您必须从邮件中解析该信息。这种限制已在其他地方提出:

Robustly retrieve which field caued 'duplicate key error' in Mongo

以下JIRA门票:

但是,在您的示例中(副本为null),我强烈建议您在客户端级别尽可能多地进行验证,而不是依赖数据库来处理可在此处执行的任何验证。客户端。

答案 1 :(得分:0)

据我所知,您无法直接在错误中获取重复文档的密钥,因为它不是Mongo驱动程序的核心功能。如果引发重复键异常,最好的办法可能是对集合执行查找操作。您可以考虑在Mongo Jira上打开一张票,看看开发团队是否有兴趣在将来添加这样的功能。

答案 2 :(得分:0)

如果引发了复制密钥特殊情况,

发现累积操作。 如果您需要查看记录的真实密钥,请查询system.indexes,如:

db.collection('system.indexes').findOne({ ns: 'mean-dev.users', name: 'username_1' }, cb);