如何将基于java.util.Map的映射与Spring Data MongoDB注释(@ Id,@ Field,...)结合起来?

时间:2016-12-14 17:16:07

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

我要存储具有特定ID的动态文档。通过动态文档,我指的是一个字符串到对象的映射,我并不真正关心确切的映射,以便以任意形式存储文档。但是,我希望通过编程方式指定的某个ID来标识这些文档,但我希望使用org.springframework.data.annotation.Id声明该ID。这是我期望工作的文档映射:

@Document(collection = "mappings")
public final class Mapping
        extends org.bson.Document { // implements Map<String, Object> implicitly

    @Id
    private String id;

    public void setId(final String id) {
        this.id = id;
    }

}

各自的存储库:

@Repository
interface IMappingRepository
        extends MongoRepository<Mapping, String> {
}

不幸的是,由于实现了Map接口(我猜),ID注释似乎在映射中被完全忽略。例如,如果我自己指定_id属性,我可以轻松覆盖密钥:

final Mapping mapping = new Mapping();
mapping.put("_id", "foo");
mappingRepository.save(mapping);
  

{&#34; _id&#34; :&#34; foo&#34;,&#34; _class&#34; :&#34; foo.Mapping&#34;,...}

但是,如果我像这样分配带注释的字段(我想使用的方式):

final Mapping mapping = new Mapping();
mapping.setId("foo");
mappingRepository.save(mapping);

然后我的映射无法自动分配密钥:

  

{&#34; _id&#34; :ObjectId(&#34; 585173b7853b017ee9c1468f&#34;),&#34; _class&#34; :&#34; foo.Mapping&#34;,...}

这个问题的另一个缺陷是,例如,存储库中的delete(entity)无法抛出以下异常:

  

java.lang.IllegalArgumentException:给定的id不能为null!
         在org.springframework.util.Assert.notNull(Assert.java:115)〜[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
         在org.springframework.data.mongodb.repository.support.SimpleMongoRepository.delete(SimpleMongoRepository.java:156)〜[spring-data-mongodb-1.9.5.RELEASE.jar:na]
         在org.springframework.data.mongodb.repository.support.SimpleMongoRepository.delete(SimpleMongoRepository.java:166)〜[spring-data-mongodb-1.9.5.RELEASE.jar:na]

库源代码:

____    public void delete(ID id) {
156:        Assert.notNull(id, "The given id must not be null!");
____        mongoOperations.remove(getIdQuery(id), entityInformation.getJavaType(), entityInformation.getCollectionName());
____    }
____
____    /*
____     * (non-Javadoc)
____     * @see org.springframework.data.repository.CrudRepository#delete(java.lang.Object)
____     */
____    public void delete(T entity) {
____        Assert.notNull(entity, "The given entity must not be null!");
166:        delete(entityInformation.getId(entity));
____    }

看起来我的地图ID始终被忽略,但mappingRepository.delete(id)效果很好。

同样,@Field注释也完全被忽略。

我缺少什么,如何将Spring Data MongoDB注释与类似地图的对象结合起来?或者是否可以打开&#34;展开&#34;映射顶层的映射字段(例如,Map<String, Object> map可以某种方式注释,以便与父对象合并,类似于com.fasterxml.jackson.annotation.JsonUnwrapped的设计用途?或者我只是错过了这样做的惯用方法吗?谢谢!

编辑1:

我想做一个小的修正:如果Mapping.id字段从映射中移除(实际上缺少@Id),则mappingRepository.delete(ID)将失败并显示NullPointerException

0 个答案:

没有答案