当前位置:  开发笔记 > 编程语言 > 正文

Spring数据MongoDb:MappingMongoConverter删除_class

如何解决《Spring数据MongoDb:MappingMongoConverter删除_class》经验,为你挑选了4个好方法。

默认的MappingMongoConverter将自定义类型键("_class")添加到数据库中的每个对象.所以,如果我创建一个Person:

package my.dto;
public class Person {
    String name;
    public Person(String name) {
        this.name = name; 
    }
}

并将其保存到db:

MongoOperations ops = new MongoTemplate(new Mongo(), "users");
ops.insert(new Person("Joe"));

mongo中的结果对象将是:

{ "_id" : ObjectId("4e2ca049744e664eba9d1e11"), "_class" : "my.dto.Person", "name" : "Joe" }

问题:

    将Person类移动到不同的命名空间有什么含义?

    是否有可能不用"_class"键污染对象; 没有为Person类编写一个独特的转换器?

Oliver Drotb.. 28

所以这就是故事:我们默认添加类型作为某种暗示实际实例化的类.由于您必须通过管道输入文档来进行读取,MongoTemplate因此有两种可能的选择:

    您可以输入可以分配给实际存储类型的类型.在这种情况下,我们考虑存储的类型,用于创建对象.这里的经典示例是进行多态查询.假设你有一个抽象类Contact和你的Person.然后,您可以查询ContactS和我们基本上必须确定一个类型的实例.

    如果你 - 另一方面 - 传递一个完全不同的类型,我们只是编组到那个给定的类型,而不是实际存储在文档中的类型.这将涵盖您的问题,如果您移动类型会发生什么.

您可能有兴趣观看此票据,其中包含某种可插入类型映射策略,以将类型信息转换为实际类型.这可以简单地节省空间,因为您可能希望将长限定类名减少为几个字母的哈希值.它还允许更复杂的迁移方案,您可能会在其中找到由另一个数据存储客户端生成的完全任意类型的密钥,并将这些密钥绑定到Java类型.



1> Oliver Drotb..:

所以这就是故事:我们默认添加类型作为某种暗示实际实例化的类.由于您必须通过管道输入文档来进行读取,MongoTemplate因此有两种可能的选择:

    您可以输入可以分配给实际存储类型的类型.在这种情况下,我们考虑存储的类型,用于创建对象.这里的经典示例是进行多态查询.假设你有一个抽象类Contact和你的Person.然后,您可以查询ContactS和我们基本上必须确定一个类型的实例.

    如果你 - 另一方面 - 传递一个完全不同的类型,我们只是编组到那个给定的类型,而不是实际存储在文档中的类型.这将涵盖您的问题,如果您移动类型会发生什么.

您可能有兴趣观看此票据,其中包含某种可插入类型映射策略,以将类型信息转换为实际类型.这可以简单地节省空间,因为您可能希望将长限定类名减少为几个字母的哈希值.它还允许更复杂的迁移方案,您可能会在其中找到由另一个数据存储客户端生成的完全任意类型的密钥,并将这些密钥绑定到Java类型.



2> mkyong..:

这是我的注释,它的工作原理.

@Configuration
public class AppMongoConfig {

    public @Bean
    MongoDbFactory mongoDbFactory() throws Exception {
        return new SimpleMongoDbFactory(new Mongo(), "databasename");
    }

    public @Bean
    MongoTemplate mongoTemplate() throws Exception {

        //remove _class
        MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);

        return mongoTemplate;

    }

}



3> Athlan..:

如果要_class默认禁用属性,但保留指定类的多态性,则可以通过配置来明确定义_class(可选)字段的类型:

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    Map, String> typeMapperMap = new HashMap<>();
    typeMapperMap.put(com.acme.domain.SomeDocument.class, "role");

    TypeInformationMapper typeMapper1 = new ConfigurableTypeInformationMapper(typeMapperMap);

    MongoTypeMapper typeMapper = new DefaultMongoTypeMapper(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, Arrays.asList(typeMapper1));
    MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
    converter.setTypeMapper(typeMapper);

    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
    return mongoTemplate;
}

这将仅保留_class指定实体的字段(或您要在构造器中命名的任何字段)。

您也可以编写自己TypeInformationMapper的注释,例如基于注释。如果您通过注释文档,@DocumentType("aliasName")则将通过保留类的别名来保持多态。

我已经在博客上对其进行了简要说明,但是这里有一些快速代码:https : //gist.github.com/athlan/6497c74cc515131e1336



4> 小智..:















 

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有