2014-09-30 48 views
11

我有春天的数据通过XML MONGO自定义转换设置如下春天数据的MongoDB:从自定义转换器中访问默认POJO转换器

<mongo:mapping-converter id="mongoConverter" db-factory-ref="mongoDbFactory"> 
    <mongo:custom-converters> 
     <mongo:converter ref="customWriteConverter" /> 
     <mongo:converter ref="customReadConverter" /> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
    <constructor-arg ref="mongoDbFactory"/> 
    <constructor-arg ref="mongoConverter"/> 
</bean> 

<bean id="customWriteConverter" class="package.WriteConverter" /> 
<bean id="customReadConverter" class="package.ReadConverter" /> 

在自定义读/写器,我想重新用弹簧-data-mongo默认的pojo转换器将某些属性保存为子文档。

考虑一个简单的例子 -

class A { 
    B b; 
    String var1; 
    int var2; 
} 

class B { 
    String var3; 
    String var4; 
} 

我想要处理类的每个转换的使用customWriteConvertercustomReadConverter,但在我的自定义转换器我也想委托B类转换回弹簧数据蒙戈的默认的POJO转换器。

我该怎么做?自从尝试创建自定义转换器时正在进行MongoConverter/MongoTemplate bean创建时,我无法成功将MongoConverter或MongoTemplate自动装入自定义转换器。是否有可能访问默认转换器并使用自定义转换器内的转换器?

+0

你找到了一个解决方案? – jacob 2015-03-11 13:34:41

+0

@jacob - 不,我的课程序列化很幸运,所以我最终为它编写了一个自定义转换器。 – ashutosh 2015-03-13 10:40:56

+0

你检查了[这个问题](http://stackoverflow.com/questions/13780692/set-mongodb-converter-programatically)?我相信这会帮助你使用你的自定义转换器 – 2015-05-23 18:45:47

回答

3

此方法用于MongoTemplate类中以获取默认转换器。

private static final MongoConverter getDefaultMongoConverter(MongoDbFactory factory) { 
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); 
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext()); 
    converter.afterPropertiesSet(); 
    return converter; 
} 

MappingMongoConverter不是最终的,因此可以为特定目的被覆盖。正如我在上面的评论中提到的那样,查看this question可能会找到解决您的问题的方法。

+0

虽然它是私人的,它确实告诉我如何去做。谢谢! – 2015-05-28 10:58:48

+1

如果我正确理解你,我应该从我的自定义转换器调用此静态方法。但是,如何从我的自定义转换器中获得一个MongoDbFactory来将其传递到此静态方法中? – ashutosh 2015-05-29 09:25:43

2

如果要转换为蒙戈数据库,并希望为默认的一些转换,你可以做这样的事情:

... 

    @Resource 
    private ObjectFactory<MappingMongoConverter> 
     mappingMongoConverterObjectFactory; 

    private MappingMongoConverter 
     mappingMongoConverter; 

    ... 

    //Otherwise, use default MappingMongoConverter 
    // 
    if (result == null) 
     result = 
      getMappingMongoConverter() 
       .convertToMongoType(
        value 
       ); 

    ... 

    MappingMongoConverter getMappingMongoConverter() { 
     if (mappingMongoConverter == null) 
      mappingMongoConverter = 
       mappingMongoConverterObjectFactory.getObject(); 
     return 
      mappingMongoConverter; 
    } 

的MappingMongoConverter不能直接@Resource(ED)在我的情况,因为它是在这个过程中在构建其他转换器时正在构建。所以,Spring检测到一个循环引用。我不确定是否有一个更好的“惰性”方法,没有所有的ObjectFactory的运行,getter方法和缓存。

现在,如果有人能够找到一种方法来在完成此圆时返回(从DBObject到java对象)的默认标准处理。

+0

如果知道目标类型,则FROM为: result = getMappingMongoConverter()。read(targetType,dbObject); – pbatey 2015-12-30 18:20:10

0

尝试在你的转换器和转换方法从Bean工厂获取mongoTemplate注入的BeanFactory ...